这两天用NDK编译SO库,总是报这个错:

/0/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/u_hw_api/u_hw_api.o: in function card_close:jni/u_hw_api.c:391: error: undefined reference to 'Reader_close


仔细看了一下代码,发现该做的步骤都做了,

1. 对需要调用的so库进行预编译

2. 引用头文件

3. 在MK中加入该库的动态链接

但是,尽管上面的操作做了,用NDK编译,就出现找不到方法,折腾了一天,发现,这个代码需要同时调用4个SO库,但是其它的so库没有问题。

最后,仔细排查,发现头文件之间存在差异。因为报错的so,是C++代码编译而成的,而该头文件没有加

#ifdef __cplusplus
extern "C" {
#endif

。。。。。。

#ifdef __cplusplus
}

所造成ndk在编译LD的时候,无法连接到SO库的方法,从而报错。

补充: 若加了上面代码还不行,可以暂时把C++的源码,改为C代码,重新编译so库。网上贴吧也有人说,可能是NDK的版本有buf,可以选用较新的编译试试。

Logo

更多推荐