Chamar o método nativo duas vezes da biblioteca de terceiros em uma Activity faz com que o aplicativo Android seja encerrado

Eu integrei duas bibliotecas nativas (.so) no meu aplicativo. As bibliotecas compilam bem e eu posso carregá-las no meu aplicativo também. A primeira vez que invoco um método nativo de uma biblioteca funciona bem, mas se eu chamar o mesmo método novamente na Activity, o aplicativo é encerrado.

O problema que estou enfrentando é exatamente o mesmo mencionado aqui:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call

A solução que funciona é invocar o método nativo em outra Activity e desligá-lo com força através de System.exit (0). Seguindo o artigo, tentei configurar os ponteiros para NULL do método chamado após uma operação bem-sucedida, mas isso também não me ajudou. Também não é possível descarregar uma biblioteca uma vez carregada por System.loadLibrary ().

Eu quero chamar os métodos nativos mais de uma vez sem criar uma nova atividade. Alguma idéia de como resolver esse problema?

(ENCONTREI FINALMENTE UMA SOLUÇÃO ... AQUI ESTÁ)

Ok, finalmente encontrei uma maneira de resolver esse problema. A solução é bem simples. Construa outra biblioteca nativa independente (biblioteca de utilitários) para carregar e descarregar as outras bibliotecas. O que precisamos fazer é usar dlopen () e dlclose () no método nativo do utilitário. Podemos carregar a biblioteca de utilitários como antes via System.loadLibrary ().

Portanto, no método nativo da biblioteca de utilitários, o que precisamos fazer é:

Usar#include <dlfcn.h> // isto é necessário para chamar as funções dlopen () e dlclose ().

Forneça o manipulador e protótipo de função:

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

Abra a biblioteca via dlopen ():

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

Obtenha e chame a função da biblioteca:

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

Agora que a ligação está terminada. Feche-o via dlclose ():

dlclose(handle);

Espero que isso ajude os outros a enfrentar o mesmo problema.

questionAnswers(2)

yourAnswerToTheQuestion