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.
Was versucht der native Code zu tun, wenn er abstürzt, und was ist der Fehler? –
Behalten Sie einige JNI-Zeiger (JniENV, jobject-s usw.) auf der nativen Seite zwischen Dienstneustarts? – ognian