我在我的应用程序中集成了两个本机库(.so)。这些库编译得很好,我也可以将它们加载到我的应用程序中。第一次调用库的本机方法时,它工作正常,但如果我在活动中再次调用相同的方法,应用程序将关闭。
我面临的问题与这里提到的完全相同:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
有效的解决方案是调用另一个 Activity 中的本机方法,并通过 System.exit(0) 强制关闭它。在这篇文章之后,我尝试在成功操作后将被调用方法的指针设置为 NULL,但这也没有帮助我。而且,一旦由 System.loadLibrary() 加载库,就无法卸载库。
我想多次调用本机方法而不创建新的活动。有什么想法如何解决这个问题吗?
(我终于找到了解决方案......就在这里)
好吧,我终于找到了解决这个问题的方法。解决方案实际上非常简单。构建另一个独立的本机库(实用程序库)来加载和卸载其他库。我们需要做的是在实用程序的本机方法中使用 dlopen() 和 dlclose()。我们可以像以前一样通过 System.loadLibrary() 加载实用程序库。
因此,在实用程序库的本机方法中,我们需要做的是:
Use#include <dlfcn.h>
// 这是调用 dlopen() 和 dlclose() 函数所必需的。
提供处理程序和函数原型:
void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
通过 dlopen() 打开库:
handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
获取并调用库的函数:
myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call
现在通话已经完成。通过 dlclose() 关闭它:
dlclose(handle);
希望这能帮助其他面临同样问题的人。