JNI动态加载so文件

最近在工作中遇到一个问题,就是一些c/c++工程师写好的代码要移植到移动端使用,但是这些函数本身不可能符合JNI规范,打包出来的so动态依赖库是没办法直接调用的。所以还是要写jni来动态加载so文件,把他们桥接起来,Jni怎么写这里就不说了,在c/c++文件里#include <dlfcn.h>这个头文件,写个函数指针,利用dlopen()函数就可以实现动态加载so文件。这里有如下几点心得体会:


①打包成so库的时候,一定要注意交叉编译的工具链。不同的工具链打包出来的so文件是不能在不同架构上打开的,比如工具链是android_x86,就不能在是x86_64的架构的手机上使用,这点当初入坑了。还有一点的是,虽然android内核是linux,但linux_x86工具链打包出来的so文件也是不能在android_x86上打开的。

②一般而言,so库应该尽量暴露出少的接口,在写jni之前,应该先写一份c/c++的代码包含需要暴露出来的接口,再在Jni调用这份代码里面的函数。

③dlopen()函数传so文件路径的文件,这个so件同样用System.loadLibrary()即可,放在libs或者jniLibs目录下。打开的时候直接dlopen("xx.so");不需要在其它路径上再放置一份。

猜你喜欢

转载自blog.csdn.net/aa642531/article/details/75675887