2010-12-07 3 views
0

J'ai un service android qui utilise une bibliothèque native via NDK/JNI. La bibliothèque native est statiquement chargé/initialisé comme l'a suggéré ...L'appel à JNI se bloque après le redémarrage du service android?

static { 
    System.loadLibrary("mylibrary"); 
    if (!nativeClassInit()) 
     throw new RuntimeException("native init failed"); 
} 

Tout fonctionne bien jusqu'à ce que le service est arrêté (par exemple, d'une activité d'assurance-chômage où le service peut être démarré/arrêté). Le problème est lorsque le service est arrêté la tâche n'a pas encore été tué par android et si l'utilisateur redémarre le service les bibliothèques natives ne sont pas rechargées et un appel à une fonction native provoque un plantage dans le code natif?

J'ai essayé à nouveau d'appeler la méthode nativeClassInit() après un redémarrage mais cela n'aide pas? En outre, j'ai vu dans d'autres messages que le déchargement de la bibliothèque native n'est pas autorisé dans Android.

+0

Qu'est-ce que le code natif essaie de faire lorsqu'il se bloque, et quelle est l'erreur? –

+0

Conservez-vous certains pointeurs JNI (JniENV, jobject-s, etc.) du côté natif entre les redémarrages du Service? – ognian

Répondre

0

J'ai trouvé en faisant fonctionner le service dans son propre processus privé et en ayant le service se tuer dans sa méthode onDestroy() via android.os.Process.killProcess() a résolu mon problème. Je ne sais pas si c'est la façon la plus correcte mais je serais heureux d'entendre des suggestions.

En ce qui concerne les commentaires ci-dessus ...

Quel est le code natif tente de faire quand il se bloque, et quelle est l'erreur?

The native code crashed as soon as an internal native library function was called just before the crash an __android_log_print was done displaying the correct parameter values passed in. Its hard to say what exactly happened from the dump. 

-vous préservez quelques conseils JNI (JNIEnv, jobject-s, etc.) sur le côté natif entre les redémarrages de service? Oui, je conserve la JVM dans la méthode Onload ainsi que les identifiants de classe JNI ID de classe & dans ma méthode d'initialisation statique. J'ai essayé de rappeler la méthode d'initialisation statique mais le même accident s'est produit.

Questions connexes