6

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

实际上,对于调试和发布版本,共享对象文件似乎是相同的。(文件夹中输出的唯一区别libs是是否创建了gsb.setupandgdbserver文件。)我用APP_CFLAGS += -O3my中的 an 覆盖了 NDK 设置的优化Application.mk,但我不希望发布版本生成调试符号包括-g它所做的标志。

我在 SO 上找到了一条评论,指出“在调试和发布这两种情况下,它都会保留 -g 标志,因为引用评论,”我们生成二进制文件的符号版本,这些版本在被复制到最终项目时会被剥离libs/ 目录"',另一个声明:'如果 java 没有名称,JNI 找不到这些函数。'

ndk-build肯定会从文件中删除一些东西obj/armeabi-v7a/libXXXlib.so,因为它比最终在 中创建的要大得多libs,但它似乎仍然将我所有的函数和变量的名称完整地保留在文件中。

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

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

4

1 回答 1

8

随意设置默认可见性=隐藏,并为您需要在 Windows 中导出的几个函数(类似于 DLLEXPORT)设置属性可见性=默认值

于 2013-06-10T20:25:58.233 回答