Android:捕获SIGSEGV信号JNI

时间:2011-05-24 13:35:59

标签: android java-native-interface signals sigsegv tesseract

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

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

有人有建议吗?

由于

2 个答案:

答案 0 :(得分:1)

虽然您可以使用本机信号处理程序捕获SIGSEGV,但您可能会发现在处理程序中执行android api交互方面的任何有用的操作都非常容易。

可能最好的办法是理解并解决问题。

在解决方法方面 - 这确实是一个非常低劣的解决方案 - 你可能会使用AlarmManager在未来几秒钟内设置一个事件,并取消它/如果你结果仍在运行后再推出它“冒险”的行动。或者您可以启动服务(不在同一进程中运行),如果服务连接丢失,将重启您的应用程序。

答案 1 :(得分:0)

因为没人帮忙。我想指出的是,质疑意图或目标是不尊重的。我们想要的是事实,而不是意见或猜测。这似乎是一种习惯。在我的情况下,我想捕获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;