我正在开发一个能够加载两个共享库的Android应用程序。一个是外部的,它叫做libpcan.so。通常它的构建到libpcan.so.0.6,这在某种程度上不能被我的android使用,所以我改变了gcc标志来编译它:
arm-linux-androideabi-gcc src/libpcan.c -fPIC -shared -O2 -Wall -Wl,-soname,-libpcan.so.0 -lc -I. -I../driver -DNO_RT -o -libpcan.so.0.6
ln -sf libpcan.so.0.6 libpcan.so
到
arm-linux-androideabi-gcc src/libpcan.c -fPIC -shared -O2 -Wall -lc -I. -I../driver -DNO_RT -o -libpcan.so
这个.so与so.0.6的大小相同所以我认为它工作正常。
我自己的c代码正在编译
arm-linux-androideabi -shared src/receivetest.c src/common.c -I. -I../lib -I../driver -L../lib -L/lib -L/usr/lib -L/usr/local/lib -o libreceivetest.so
我加载了这两个文件,所以libpcan.so和libreceivetest.so到我的应用程序
static {
System.loadLibrary("pcan");
System.loadLibrary("receivetest");
}
当我尝试启动该应用时,我收到错误消息:
07-14 11:12:43.812: E/AndroidRuntime(753): java.lang.ExceptionInInitializerError
07-14 11:12:43.812: E/AndroidRuntime(753): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1306]: 36 cannot locate 'CAN_Open'...
我的receivetest正在使用该函数,但由于它在libpcan.so中声明并且我还加载了该库,我不知道该错误可能来自何处。 我只是猜测它的错误,因为我刚开始使用外壳中的gcc构建.so文件,我真的不明白我使用的所有标志。
答案 0 :(得分:0)
我解决了这个问题已经很久了。但我没有把这个问题标记为已解决。 感谢jww提醒我。
正如我在对我的问题的评论中所说,由于编译.so文件时缺少参数,因此缺少函数CAN_Open的链接。函数CAN_Open是libpcan.so的一部分,通过跳过该文件的链接,CAN_Open函数从未进入receivetest.so。