是否可以从使用Android NDK构建的共享库中删除符号?

Ric*_*ich 6 java-native-interface android debug-symbols release-builds android-ndk

我正在构建一个共享库,以便在使用Android NDK的Java应用程序中使用.使用readelf来检查lib/armeabi-v7a/libXXXlib.so由发布版本生成的文件,它似乎包含我的家乡C/C++代码的所有符号(函数,变量名).

实际上,共享对象文件对于调试和发布版本似乎是相同的.(在输出唯一的区别libs文件夹是是否将gsb.setupgdbserver正在创建的文件.)我重写优化利用NDK与设置APP_CFLAGS += -O3在我Application.mk,但我不希望发布版本通过生成调试符号包括-g它所做的旗帜.

我在SO上发表评论说'在这两种情况下,调试和发布,它会留下-g标志,因为引用注释,"我们生成二进制文件的符号版本,当它们被复制到最终项目时会被剥离libs /目录"',另一个说明:'如果没有名字,JNI找不到java的函数.'

ndk-build肯定obj/armeabi-v7a/libXXXlib.so文件中剥离了一些东西,因为它比最终创建的东西大得多libs,但它似乎仍然在文件中保留我的所有函数和变量的名称.

JNI 是否需要我所有的函数名称(而不仅仅是本机代码的入口点)?

如果没有,我该如何删除不需要的符号?

Ale*_*ohn 8

您可以随意设置默认的visibility = hidden,并为Windows中需要导出的少数函数设置属性visibility = default(类似于DLLEXPORT)

  • 此外,如果您使用JNI方法的显式注册,您甚至不需要这些方法可见.请参阅http://developer.android.com/training/articles/perf-jni.html#native_libraries. (3认同)
  • 谢谢@ alex-cohn,@ fadden.我在``Android.mk`中将`-fvisibility = hidden`添加到我的`LOCAL_CFLAGS`中,它从我正在导出的JNI入口点中删除了所有符号**.(所以我没有在JNI_OnLoad中设置JNI方法的显式注册.)你知道是什么设置了这些函数的可见性吗? (2认同)