我有一个静态库,Foo,由共享库Bar使用. Bar是我的
Android应用加载的本机共享库. Foo包含仅由Java代码调用的JNI函数,而不是Bar中的任何C代码.因此,在构建共享库(Bar)时,这些JNI函数会从静态库(Foo)中删除.我目前正在使用一种稍微粗暴的方法来防止这种情况发生.
解决方法
@H_301_7@ 他们没有被剥夺,他们被忽略了.链接共享库时,链接器仅使用实际使用的函数提取目标文件. (这是静态库的定义方式.)我相信将“–whole-archive”标志传递给链接器会导致它从静态库中提取所有目标文件.您可以在gcc链接行中使用“-Wl,-whole-archive”提供它.在指定库之后,您需要使用“-Wl,-no-whole-archive”跟随它,或者ld将继续执行它遇到的任何其他静态库的行为,这可能不是您想要的行为.另请参见Linux系统上的ld(1)手册页.
另一种完成相同操作的方法是输出单个大型.o文件而不是.a文件.
编辑:
简单的命令行示例,在桌面上使用libz:
% echo "int main() { return 0; }" > foo.c % gcc -o foo /usr/lib/libz.a foo.c % ls -s foo 12 foo* % gcc -o foo -Wl,-whole-archive /usr/lib/libz.a -Wl,-no-whole-archive foo.c % ls -s foo 104 foo*
(你必须在这里使用“/usr/lib/libz.a”而不是“-lz”,因为后者找到共享库/usr/lib/libz.so.)
我没有多少使用NDK,但看起来像将标志添加到LOCAL_LDFLAGS可能会有所帮助.