Al llamar dos veces al método nativo de una biblioteca de terceros en una actividad, la aplicación de Android se cierra.

He integrado dos bibliotecas nativas (.so) en mi aplicación. Las bibliotecas se compilan bien y también puedo cargarlas en mi aplicación. La primera vez que invoco un método nativo de una biblioteca funciona bien, pero si vuelvo a llamar al mismo método en la Actividad, la aplicación se apaga.

El problema al que me enfrento es exactamente el mismo que se menciona aquí:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call

La solución que funciona es invocar el método nativo en otra actividad y apagarlo a la fuerza a través de System.exit (0). Después del artículo, intenté establecer los punteros a NULL del método llamado después de una operación exitosa, pero esto tampoco me ayudó. Tampoco es posible descargar una biblioteca una vez que está cargada por System.loadLibrary ().

Quiero llamar a los métodos nativos más de una vez sin crear una nueva Actividad. ¿Alguna idea de cómo resolver este problema?

(FINALMENTE ENCONTRÉ UNA SOLUCIÓN ... AQUÍ ESTÁ)

Bueno, finalmente he encontrado una manera de resolver este problema. La solución es en realidad bastante simple. Cree otra biblioteca nativa independiente (biblioteca de utilidades) para cargar y descargar las otras bibliotecas. Lo que debemos hacer es usar dlopen () y dlclose () en el método nativo de la utilidad. Podemos cargar la biblioteca de utilidades como antes a través de System.loadLibrary ().

Entonces, en el método nativo de la biblioteca de utilidades, lo que debemos hacer es:

Utilizar#include <dlfcn.h> // esto es necesario para llamar a las funciones dlopen () y dlclose ().

Proporcionar manejador y prototipo de función:

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

Abra la biblioteca a través de dlopen ():

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

Obtener y llamar a la función de la biblioteca:

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

Ahora que la llamada está hecha. Ciérralo mediante dlclose ():

dlclose(handle);

Espero que esto ayude a otros que enfrentan el mismo problema.

Respuestas a la pregunta(2)

Su respuesta a la pregunta