首页 > 解决方案 > 从仅导出全局和可见符号的静态存档 (`.a`) 创建共享库 (`.so`)

问题描述

我有一个foo.a包含很多符号的静态库 ( ),例如:

0000000000000000 l    d  .text.finish_doctype_system_id 00000000 .text.finish_doctype_system_id
0000000000000000 gw    F .text._ZN16FlutterContainer14create_elementEPKcRKNSt6__ndk13mapINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES9_NS2_4lessIS9_EENS7_INS2_4pairIKS9_S9_EEEEEERKNS2_10shared_ptrIN8litehtml8documentEEE        0000003c .hidden _ZN16FlutterContainer14create_elementEPKcRKNSt6__ndk13mapINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES9_NS2_4lessIS9_EENS7_INS2_4pairIKS9_S9_EEEEEERKNS2_10shared_ptrIN8litehtml8documentEEE

...

0000000000000000 g     F .text.document_width   0000002c document_width

当我用-whole-archive它创建一个.so.a,所有符号都出现在.so. 但是,我只希望导出全局和非隐藏符号。

在上面的案例中,我只想document_width被导出。

标签: androidc++java-native-interface

解决方案


如果您正在使用 JNI,并且正在使用 JNI_OnLoad,您可以使用 RegisterNatives 方法注册所有公共符号,并使用

-fvisibility=hidden 

你可以参考这个了解更多细节:https ://developer.android.com/training/articles/perf-jni#native-libraries


推荐阅读