2011-05-24 43 views
1

我正在使用tesseract項目將圖像轉換爲字符串。 但是,SIGSEGV信號從JNI發送(隨機?)。Android:捕獲SIGSEGV信號JNI

我想在發送信號時重新啓動我的應用程序,但是我沒有找到任何解決方案來「捕捉」Java的信號。

任何人都有建議嗎?

感謝

+1

**是否可以接受任何其他問題的答案??? ** – 2011-05-24 15:35:15

回答

1

雖然你可以捕捉SIGSEGV與本地信號處理程序,你可能不會發現它很容易在處理程序中做任何事情,在Android的API互動方面非常有用。

可能最好的辦法是瞭解並解決問題。

就解決方法而言 - 這實際上是一個非常低劣的解決方案 - 您可能想用AlarmManager在未來幾秒內設置一個事件,並取消它/如果您仍然在運行在「風險」操作之後。或者你可以啓動一個服務(不在同一進程中運行),如果服務連接丟失,它將重新啓動你的應用程序。

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;