1

我正在开发一个加载两个共享库的 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'...

我的接收测试正在使用该函数,但由于它在 libpcan.so 中声明并且我还加载了该库,所以我不知道该错误可能来自哪里。我只是猜测这是我的 cags 中的一个错误,因为我是通过在 shell 中使用 gcc 来构建 .so 文件的新手,我并不真正了解我使用的所有标志。

4

1 回答 1

0

我解决这个问题已经很久了。但我从未将这个问题标记为已解决。感谢jww提醒我。

正如我在对我的问题的评论中所说,由于编译 .so 文件时缺少参数,函数 CAN_Open 的链接丢失了。CAN_Open 函数是 libpcan.so 的一部分,通过跳过指向该文件的链接,CAN_Open 函数从未进入 receivetest.so 。

于 2014-09-02T09:57:41.027 回答