Nella mia applicazione sono integrate due librerie native (.so). Le librerie si compongono bene e posso caricarle anche nella mia applicazione. La prima volta che invoco un metodo nativo di una libreria funziona correttamente, ma se richiamo di nuovo lo stesso metodo nell'attività l'applicazione si arresta.Chiamando il metodo nativo due volte di una libreria di terze parti in un'attività, l'applicazione Android viene chiusa
Il problema che sto affrontando è esattamente lo stesso di cui al qui:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
La soluzione che funziona è quella di invocare il metodo nativo in un'altra attività e spegnerlo con forza tramite System.exit (0) . Seguendo l'articolo ho provato a impostare i puntatori su NULL del metodo chiamato dopo un'operazione riuscita, ma anche questo non mi ha aiutato. Inoltre non è possibile scaricare una libreria una volta caricata da System.loadLibrary().
Voglio chiamare i metodi nativi più di una volta senza creare una nuova attività. Qualche idea su come risolvere questo problema?
(ho finalmente trovato una soluzione ... ECCO)
Va bene, ho finalmente trovato un modo per risolvere questo problema. La soluzione è in realtà piuttosto semplice. Costruisci un'altra libreria nativa indipendente (libreria di utilità) per caricare e scaricare le altre librerie. Quello che dobbiamo fare è usare dlopen() e dlclose() nel metodo nativo dell'utilità. Possiamo caricare la libreria di utilità come prima tramite System.loadLibrary().
Così, nel metodo nativo della libreria di utilità quello che dobbiamo fare è: funzioni
Usa #include <dlfcn.h>
// questo è necessario per chiamare dlopen() e dlclose().
Fornire conduttore e prototipo di funzione:
void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
Aprire la libreria tramite dlopen():
handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
Prendi e chiamare la funzione della biblioteca:
myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call
Ora che il la chiamata è fatta. Chiudilo via dlclose():
dlclose(handle);
Spero che questo aiuti gli altri ad affrontare lo stesso problema.
dove si fa dlclose (handle)? Intendo nel codice Attività o JNI? –
È in codice JNI. È una funzione disponibile tramite il file di intestazione dlfcn.h. – ZakiMak
ok capito, vedo che carichi e scarica altre librerie in questa classe c. Ma come dovrei collegarlo al mio codice Java? –