首页 > 解决方案 > 编译 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.

什么可能导致这个无效的库编译?

标签: androidc++cmakeandroid-ndk

解决方案


链接器尝试修剪来自非整个静态库的任何未使用的符号,并且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 风格。


推荐阅读