gpt4 book ai didi

android - Activity调用第三方库native方法两次导致Android应用关闭

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:43 27 4
gpt4 key购买 nike

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

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

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

我想在不创建新 Activity 的情况下多次调用 native 方法。有什么想法可以解决这个问题吗?

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

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

所以在实用程序库的native方法中我们需要做的是:

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

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

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);

希望这能帮助其他面临同样问题的人。

最佳答案

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

对我来说效果很好,希望对其他人有帮助。

关于android - Activity调用第三方库native方法两次导致Android应用关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10649119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com