2010-12-07 9 views
0

Ich habe einen Android-Dienst, der eine native Bibliothek über NDK/JNI verwendet. Die native Bibliothek wird statisch initialisiert geladen/wie vorgeschlagen ...Anruf an JNI stürzt ab, nachdem der Android-Dienst neu gestartet wurde?

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

Alles funktioniert gut, bis der Dienst beendet wird (beispielsweise von einer UI-Aktivität, wo der Dienst gestartet werden kann/gestoppt). Das Problem ist, wenn der Dienst gestoppt wurde und der Task noch nicht von Android beendet wurde. Wenn der Benutzer den Dienst neu startet, werden die nativen Bibliotheken nicht neu geladen und ein Aufruf einer nativen Funktion führt zum Absturz des systemeigenen Codes.

Ich habe versucht, die nativeClassInit() -Methode nach einem Neustart erneut aufrufen, aber das hilft nicht? Außerdem habe ich in anderen Posts gesehen, dass das Entladen der nativen Bibliothek in Android nicht erlaubt ist.

+0

Was versucht der native Code zu tun, wenn er abstürzt, und was ist der Fehler? –

+0

Behalten Sie einige JNI-Zeiger (JniENV, jobject-s usw.) auf der nativen Seite zwischen Dienstneustarts? – ognian

Antwort

0

Ich habe gefunden, indem ich den Dienst in seinem eigenen privaten Prozess ausgeführt habe und den Dienst selbst in seiner onDestroy() -Methode über android.os.Process.killProcess() beenden ließ, löste mein Problem. Nicht sicher, ob dies der richtige Weg ist, aber ich würde mich freuen, irgendwelche Vorschläge zu hören.

In Bezug auf die obigen Ausführungen ...

Was der native Code versucht, es zu tun, wenn abstürzt, und was ist der Fehler?

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. 

Sie erhalten einige JNI Zeiger (JNIEnv, jobject-s, etc.) auf nativen Seite zwischen Dienst neu gestartet wird? Ja, ich behalte die JVM in der Onload-Methode und auch JNI-Klassen-IDs & Methoden-IDs in meiner statischen Initialisierungsmethode. Ich versuchte, mich an die statische Initialisierungsmethode zu erinnern, aber es kam zu demselben Absturz.

Verwandte Themen