android - 编译 native_app_glue.c 导致库文件无效
问题描述
我正在将 C++ 库交叉编译到 Android。我使用 CMake 作为构建生成器,并且使用 NDK 中提供的工具链文件(称为android.toolchain.cmake
. 注意,我在 Windows 上。
我想将android_native_app_glue.c
源代码(也由 NDK 提供)编译为静态库,以便稍后将其链接到我的最终应用程序。在出现错误后,表示我缺少符号ANativeActivity_onCreate
,我已经开始调查。ANativeActivity_onCreate
是一个在 中定义的函数android_native_app_glue.c
,所以我查看了使用编译的库nm -o libnative_glue.a
,看到这个非常令人惊讶:
libnative_glue.a:android_native_app_glue.c.o:0000000000000000 T ANativeActivity_onCreate
libnative_glue.a:android_native_app_glue.c.o:0000000000000000 t android_app_create
libnative_glue.a:android_native_app_glue.c.o:0000000000000000 t android_app_destroy
libnative_glue.a:android_native_app_glue.c.o:0000000000000000 t android_app_entry
libnative_glue.a:android_native_app_glue.c.o:0000000000000000 t android_app_free
...
基本上我的功能是“那里”,但大小为零。我假设它们在下一个链接中被丢弃,因为它们无效 - 查看下一个工件并nm
确认。
用于编译库的 CMake 片段相当简单,但为了完整起见,我将提供它:
add_library(native_glue STATIC "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c")
我有两个用于 CMake 的预定义缓存条目,ANDROID_ABI=arm64-v8a
并且ANDROID_PLATFORM=24
.
什么可能导致这个无效的库编译?
解决方案
链接器尝试修剪来自非整个静态库的任何未使用的符号,并且ANativeActivity
不使用目录,而是用于重新导出。
您可以链接libnative_app_glue
为一个完整的档案,也可以-u
用来防止符号被丢弃。
与-u
:
target_link_libraries(mylib -u ANativeActivity_onCreate native_app_glue)
与整个档案:
target_link_libraries(mylib -Wl,--whole-archive native_app_glue -Wl,--no-whole-archive)
我实际上还没有用 CMake 测试过这些。已知 ndk-build 等效项可以工作。
您也许还可以使用对象库,这是整个档案的 CMake 风格。
推荐阅读
- r - 如何防止我的 ggplot2 时间线图上的信息被截断
- c# - 如何解决 Quartz.NET (C#) 中的休眠问题?
- flutter - 使用用户的偏好来计算
- python - 使用抓取的图像名称创建链接
- amazon-web-services - 如何在火花中加载存储在ec2单节点hadoop集群中的数据集
- java - Mockito 验证方法如何工作?
- javascript - 您如何使用 GraphQL 和 Mongoose 处理多个验证错误?
- javascript - 关闭弹出窗口?
- sql - 如果某些列有数据,则从两个表中选择比较删除 id
- amazon-web-services - 如何获得从 AWS Lambda 到 Redis 的安全访问?是否需要 VPC?