在Activity中调用第三方库的两次本机方法会导致Android应用程序关闭

Zak*_*Mak 12 java-native-interface android android-ndk

我在我的应用程序中集成了两个本机库(.so).库编译得很好,我也可以在我的应用程序中加载它们.我第一次调用库的本机方法时工作正常,但如果我在Activity中再次调用相同的方法,应用程序将关闭.

我面临的问题与此处提到的完全相同:http:
//grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call

可行的解决方案是在另一个Activity中调用本机方法,并通过System.exit(0)强制关闭它.在文章之后,我尝试在成功操作后将指针设置为NULL,但这也没有帮助我.一旦由System.loadLibrary()加载库,也无法卸载它.

我想在不创建新Activity的情况下多次调用本机方法.任何想法如何解决这个问题?

(我最终找到了一个解决方案......就在这里)

好的,我终于找到了解决这个问题的方法.解决方案实际上非常简单.构建另一个独立的本机库(实用程序库)来加载和卸载其他库.我们需要做的是在实用程序的本机方法中使用dlopen()和dlclose().我们可以通过System.loadLibrary()像以前一样加载实用程序库.

因此,在实用程序库的本机方法中,我们需要做的是:

使用#include <dlfcn.h>//这是调用dlopen()和dlclose()函数所必需的.

提供处理程序和函数原型:

void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
Run Code Online (Sandbox Code Playgroud)

通过dlopen()打开库:

handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
Run Code Online (Sandbox Code Playgroud)

获取并调用库的功能:

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

现在呼叫完成了.通过dlclose()关闭它:

dlclose(handle);
Run Code Online (Sandbox Code Playgroud)

希望这将有助于其他人面临同样的问题.

Min*_*rip 5

所以...我的解决方案是启动一个运行共享库代码的服务,这个服务有一个不同的进程名称(你可以在Android Manifest中设置它),因为它是一个不同的进程你可以杀死它(使用Process.killProcess (Process.myPid())完成运行后,不会以任何方式影响您的应用程序.

为我工作得很好,希望它可以帮助别人.