gpt4 book ai didi

从 .lib 切换到 .so 后,Android 应用程序崩溃

转载 作者:太空狗 更新时间:2023-10-29 16:01:45 25 4
gpt4 key购买 nike

我在我的原生 Android 应用程序中使用了一些静态的预构建静态库,一切正常。现在我想将我的静态库之一切换为 .so。通过在其 android.mk 中将 BUILD_STATIC_LIBRARY 替换为 BUILD_SHARED_LIBRARY 并添加所需的依赖项,我成功地构建了 .so 库。

我还能够通过在其 android.mk 中将相应的 PREBUILT_STATIC_LIBRARY 替换为 PREBUILT_SHARED_LIBRARY 来构建我的应用程序。生成的应用程序现在无法启动。我什至无法指出调试器附加到应用程序的位置。

除此之外,我不明白的是构建系统如何知道应该从库中导入函数。我的 so 库应该导出一个函数,但我没有将它声明为 dllexport/import 之类的。我的应用程序中仍然没有未解析的符号(当我从列表中删除我的预构建库时,未解析的符号按预期出现)。

另一个问题是我看到生成了两个 .so 文件。 obj/local/$(TARGET_ARCH_ABI) 文件夹中的一个大文件和 libs/$(TARGET_ARCH_ABI) 文件夹中的另一个小文件。在声明我的预建库时,我引用了 libs 文件夹中的第二个库。

我确实尝试在 stackoverflow 上搜索答案并找到了很多相关帖子:

但我看不出这些帖子与我的问题有什么关系,因为我可以成功构建甚至链接我的应用程序。

最佳答案

您需要在 java 代码中以反向依赖顺序加载库。你以前可能有这样的事情:

System.loadLibrary("mylib");

现在,如果您的预构建库(以前是静态库,现在是共享库)名为 dependencylib ,您需要更改将库加载到此的代码:

System.loadLibrary("dependencylib");
System.loadLibrary("mylib");

至于你的问题,链接器是如何计算出来的;链接时libmylib.so ,它会在您指定的所有其他库中查找所有 undefined symbol (即在 libdependencylib.solibc.so 和其他系统库中)。只要在某处找到所有 undefined symbol ,链接器就可以了。然后在运行时,当libmylib.so加载后,它再次执行相同的例程;所有 undefined symbol 都在当前进程加载的符号列表中查找。在 Linux 上,您通常不需要像在 Windows 上那样手动将符号标记为 dllexport - 默认情况下会导出所有非静态符号。

关于从 .lib 切换到 .so 后,Android 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29583103/

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