我正在使用 Android NDK 构建一个用于 Java 应用程序的共享库。用于readelf
检查lib/armeabi-v7a/libXXXlib.so
发布版本生成的文件,它似乎包含我本机 C/C++ 代码的所有符号(函数、变量名)。
实际上,对于调试和发布版本,共享对象文件似乎是相同的。(文件夹中输出的唯一区别libs
是是否创建了gsb.setup
andgdbserver
文件。)我用APP_CFLAGS += -O3
my中的 an 覆盖了 NDK 设置的优化Application.mk
,但我不希望发布版本生成调试符号包括-g
它所做的标志。
我在 SO 上找到了一条评论,指出“在调试和发布这两种情况下,它都会保留 -g 标志,因为引用评论,”我们生成二进制文件的符号版本,这些版本在被复制到最终项目时会被剥离libs/ 目录"',另一个声明:'如果 java 没有名称,JNI 找不到这些函数。'
ndk-build
肯定会从文件中删除一些东西obj/armeabi-v7a/libXXXlib.so
,因为它比最终在 中创建的要大得多libs
,但它似乎仍然将我所有的函数和变量的名称完整地保留在文件中。
JNI是否需要我的所有函数名称(而不仅仅是本机代码的入口点)?
如果没有,如何删除不需要的符号?