我正在构建一个共享库,以便在使用Android NDK的Java应用程序中使用。使用readelf
检查发布版本生成的lib/armeabi-v7a/libXXXlib.so
文件,它似乎包含我的本机C / C ++代码的所有符号(函数,变量名称)。
实际上,共享对象文件对于调试和发布版本似乎是相同的。 (libs
文件夹中输出的唯一区别在于是否创建了gsb.setup
和gdbserver
文件。)我将覆盖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要求的名称(而不仅仅是本机代码的入口点)?
如果没有,我该如何删除不需要的符号?
答案 0 :(得分:7)
随意设置默认的visibility = hidden,并为Windows中需要导出的几个函数设置属性visibility = default(类似于DLLEXPORT)