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

时间:2013-06-10 11:36:34

标签: android android-ndk java-native-interface debug-symbols release-builds

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

实际上,共享对象文件对于调试和发布版本似乎是相同的。 (libs文件夹中输出的唯一区别在于是否创建了gsb.setupgdbserver文件。)我将覆盖NDK的优化集我APP_CFLAGS += -O3中的Application.mk,但我不希望发布版本通过包含-g标志来生成调试符号。

我发现有关SO的评论'In both cases, debug and release, it leaves the -g flag in because, to quote the comment, "we generate symbol versions of the binaries that are later stripped when they are copied to the final project's libs/ directory"',另有说明:'JNI cannot find the functions for java if they don't have names.'

ndk-build肯定会从obj/armeabi-v7a/libXXXlib.so文件中删除某些,因为它比最终在libs中创建的文件大得多,但它似乎仍然存在离开我的所有职能'和变量'名称在文件中完整无缺。

所有我的功能' JNI要求的名称(而不仅仅是本机代码的入口点)?

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

1 个答案:

答案 0 :(得分:7)

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