Das zweimalige Aufrufen der nativen Methode der Bibliothek eines Drittanbieters in einer Aktivität führt dazu, dass die Android-Anwendung geschlossen wird

Ich habe zwei native Bibliotheken (.so) in meine Anwendung integriert. Die Bibliotheken lassen sich gut kompilieren und ich kann sie auch in meine Anwendung laden. Wenn ich zum ersten Mal eine native Methode einer Bibliothek aufrufe, funktioniert sie einwandfrei. Wenn ich dieselbe Methode jedoch in der Aktivität erneut aufrufe, wird die Anwendung beendet.

Das Problem, mit dem ich konfrontiert bin, ist genau das gleiche wie hier erwähnt:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call

Die Lösung, die funktioniert, besteht darin, die native Methode in einer anderen Aktivität aufzurufen und sie über System.exit (0) gewaltsam herunterzufahren. Nach dem Artikel habe ich versucht, die Zeiger der aufgerufenen Methode nach einer erfolgreichen Operation auf NULL zu setzen, aber auch das hat mir nicht geholfen. Es ist auch nicht möglich, eine Bibliothek zu entladen, sobald sie von System.loadLibrary () geladen wurde.

Ich möchte die nativen Methoden mehrmals aufrufen, ohne eine neue Aktivität zu erstellen. Irgendwelche Ideen, wie man dieses Problem löst?

(Ich habe endlich eine Lösung gefunden ... HIER IST ES)

Okay, ich habe endlich einen Weg gefunden, um dieses Problem zu lösen. Die Lösung ist eigentlich ziemlich einfach. Erstellen Sie eine weitere unabhängige native Bibliothek (Dienstprogrammbibliothek), um die anderen Bibliotheken zu laden und zu entladen. Was wir tun müssen, ist, dlopen () und dlclose () in der systemeigenen Methode des Dienstprogramms zu verwenden. Wir können die Utility-Bibliothek wie zuvor über System.loadLibrary () laden.

In der nativen Methode der Utility-Bibliothek müssen wir also Folgendes tun:

Benutzen#include <dlfcn.h> // Dies ist erforderlich, um die Funktionen dlopen () und dlclose () aufzurufen.

Handler und Funktionsprototyp bereitstellen:

void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function

Öffne die Bibliothek über dlopen ():

handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);

Holen und Rufen Sie die Funktion der Bibliothek auf:

myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call

Jetzt ist der Anruf erledigt. Schließe es über dlclose ():

dlclose(handle);

Hoffe, dies wird anderen helfen, die sich dem gleichen Problem stellen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage