Ebo*_*ike 5 android android-ndk
我有一个包含一些JNICALL函数的静态库,即它们应该从JVM调用,并且永远不会被链接静态库的共享库引用.
然而,似乎函数剥离正在消灭JNICALL函数(它在arm-eabi-objdump -t中不可见).我正在通过添加一个具有调用JNICALL函数的不可能条件的虚函数来解决它,但这很脏.我知道有一个链接选项可以防止某些模块剥离它们未使用的数据,但它是什么?我如何在.mk文件中指定该选项?在arm-eabi-ld中我没有看到任何明显的东西.
顺便说一句,函数剥离不会剥离共享库本身的JNICALL函数,但它会从共享库链接的静态库中删除它们.这是什么原因?
它实际上看起来像NDK团队开始支持(或停止?),并且在构建系统中有它的痕迹,但缺少一些重要部分.好消息是它可以很容易地实现.
转到NDK安装中的"build"目录并搜索LOCAL_STATIC_LIBRARIES的所有实例.复制并粘贴所有这些版本,并添加与LOCAL_STATIC_WHOLE_LIBRARIES执行相同操作的版本.
确切地说:在build/core/build-binary.mk中,您需要:
LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES))
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES))
Run Code Online (Sandbox Code Playgroud)
[...]
static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES))
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES))
Run Code Online (Sandbox Code Playgroud)
[...]
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES))
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES))
Run Code Online (Sandbox Code Playgroud)
[...]
$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries)
Run Code Online (Sandbox Code Playgroud)
[...]
$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries)
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries)
Run Code Online (Sandbox Code Playgroud)
注意STATIC_WHOLE和WHOLE_STATIC之间的差异 - 就像它在NDK中的情况一样,我选择保持这种方式,即使它不一致.
现在,最后,在build/toolchains/arm-eabi-4.4.0/setup.mk中:已经存在用于共享库的PRIVATE_WHOLE_STATIC_LIBRARIES块.您也可以选择为可执行文件添加该文件,尽管这可能不是必需的.
| 归档时间: |
|
| 查看次数: |
2748 次 |
| 最近记录: |