linux 静态库、动态库
查看linux的.so包含哪些函数:nm *.so; readelf -a *.so
如果是ndk编译的.so,nm查看不出函数,得用readelf,因为android的.so或者可执行文件使用elf格式
- gcc的fvisibility=hidden 可以把所有的符号(函数和变量名)强制标记为隐藏属性,符号就变成了局部符号(t) 在android中LOCAL_CFLAGS += fvisibility=hidden
但是此时nm或者readelf是能看到所有的符号名的。
如果要导出某些函数(T),则需要在code中显式的声明:
void __attribute__ ((visibility ("default")))
flipAvatar( JNIEnv* env ) {
}
然后需要隐藏局部函数名,此时nm/readelf真的看不到隐藏的符号了:
LOCAL_PATH := $(call my-dir)
cmd-strip = $(TOOLCHAIN_PREFIX)strip --strip-debug -x $1
arm-linux-androideabi-strip --strip-unneeded *.so
strip unused information to shrink library in android platform:
LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden
LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden
LOCAL_CFLAGS += -ffunction-sections -fdata-sections LOCAL_LDFLAGS += -Wl,--gc-sections
在需要导出的api前加上 __attribute__ ((visibility ("default")))
(continue)