我正在使用tesseract项目将图像转换为字符串。 但是,SIGSEGV信号是从JNI发送的(随机?)。
我想在发送信号时重新启动我的应用程序,但是我找不到任何用Java“捕获”信号的解决方案。
有人有建议吗?
由于
答案 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;