【问题标题】:Android : Catch SIGSEGV signal JNIAndroid : 捕捉 SIGSEGV 信号 JNI
【发布时间】:2011-05-24 13:35:59
【问题描述】:

我正在使用 tesseract 项目将图像转换为字符串。 但是,SIGSEGV 信号是从他的 JNI 发送的(随机?)。

我想在发送信号时重新启动我的应用程序,但我没有找到任何解决方案来使用 Java“捕获”信号。

有人有建议吗?

谢谢

【问题讨论】:

  • 您的任何其他问题的答案都不能接受???

标签: android java-native-interface signals segmentation-fault tesseract


【解决方案1】:

虽然您可以使用本机信号处理程序捕获 SIGSEGV,但您可能会发现在处理程序中执行与 android api 交互有关的任何有用的事情并不容易。

也许最好的办法是了解并解决问题。

就解决方法而言 - 这确实是一个非常低劣的解决方案 - 您大概可以使用 AlarmManager 在未来几秒钟内设置一个事件,然后取消它/如果您仍然在运行,则将其推得更远“冒险”的操作。或者您可以启动一个服务(不在同一进程中运行),如果服务连接丢失,该服务将重新启动您的应用程序。

【讨论】:

    【解决方案2】:

    因为没有人帮忙。我想指出这样一个事实,质疑意图或目标是不尊重的。我们需要事实,而不是意见或猜测。这似乎是这里的一种习惯。就我而言,我想捕获 SIGSERV,因为我想检测共享库中的漏洞。出于安全原因,如果没有受欢迎的误报,没有其他可靠的方法来检测所述漏洞。这是我几天前发现的:

    > #include <stdio.h>
    > #include <stdlib.h>
    > #include <dlfcn.h>
    > 
    > 
    > int main(int argc, char **argv) {
    >     void *handle;
    >     void* (*doSomething)(char);
    >     char *error;
    >     handle = dlopen ("libexample.so", RTLD_LAZY);
    >     if (!handle) {
    >         fprintf (stderr, "%s\n", dlerror());
    >         exit(1);
    >     }
    >     dlerror();    /* Clear any existing error */
    >     foo = dlsym(handle, "doSomething");
    >     if ((error = dlerror()) != NULL)  {
    >         fprintf (stderr, "%s\n", error);
    >         exit(1);
    >     }
    >     printf ("%f\n", (*setDataSource)("/data/data/com.example.ap/files/cve_2015_2396.mp4"));
    >     dlclose(handle);
    >     return 0;
    

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      相关资源
      最近更新 更多