2011-05-24 3 views
1

J'utilise le projet tesseract pour convertir l'image en chaîne. Cependant, le signal SIGSEGV est envoyé (aléatoirement?) À partir du JNI. Je voulais redémarrer mon application lorsque le signal est envoyé, mais je n'ai trouvé aucune solution pour "attraper" le signal avec Java.Android: Catch signal SIGSEGV JNI

Quelqu'un a des suggestions?

Merci

+1

** Aucune réponse à AUCUNE de vos autres questions n'est acceptable ??? ** –

Répondre

1

Alors que vous pouvez attraper SIGSEGV avec un gestionnaire de signal natif, vous ne pouvez pas trouver très facile à faire quoi que ce soit utile en termes d'interaction android api dans le gestionnaire.

Probablement la meilleure chose à faire est de comprendre et de résoudre le problème. En termes de solution de contournement - et c'est vraiment une solution très inférieure - vous pourriez probablement utiliser AlarmManager pour définir un événement quelques secondes dans le futur, et l'annuler/pousser plus loin si vous vous avérez toujours en cours d'exécution après l'opération "risquée". Ou vous pouvez lancer un service (qui ne s'exécute pas dans le même processus) qui redémarrera votre application si la connexion au service est perdue.

0

Puisque personne ne vous aide. Je voudrais souligner le fait que remettre en question l'intention ou le but est irrespectueux. Nous voulons des faits, pas des opinions ou des spéculations. Cela semble être une habitude ici. Dans mon cas, je veux attraper SIGSERV parce que je veux détecter une vulnérabilité dans une bibliothèque partagée. Pour des raisons de sécurité, il n'y a pas d'autre moyen sûr de détecter cette vulnérabilité sans accueillir de faux positifs. Voici quelque chose que j'ai trouvé il y a quelques jours:

> #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; 
Questions connexes