android中调用共享库.so的几种方法

底层调用共享库中函数的方法

> 首先使用dlopen("libmedia.so", RTLD_LAZY); 加载对应的库文件libmedia.so;

> 之后使用dlsym(libhandle, "function_name"); 获取指定函数的指针;

> 最后使用获取的函数指针调用对应的函数,执行相应的操作;

需要注意的是,调用的共享库都必须在对应的Android.mk的共享库中添加;

android调用第三方共享库.so

1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int  xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;

2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;

> 首先要看这个SO是不是JNI规范的SO,比如有没有返回JNI不直接支持的类型。也就是说这个SO是不是可以直接当作JNI来调用。如果答案是否定的,你只能选第二个方案。

> 还要看你是不是希望这个SO的库直接暴露给JAVA层,如果答案是否定的,你只能选第二个方案,比如你本身也是一个库的提供者。

> 看能不能直接从JAVA调用的最简单的方法就是看SO里的函数名是不是Java_XXX_XXX_XXX格式的,是就可以,你可以自己写一个配套的JAVA文件,注意一下SO函数名和JAVA函数名的转换规则,或者向SO提供方索要;

> 使用第三方动态库,应该至少有2个文件,一个是动态库(.so),另一个是包含动态库API声明的头文件(.h)

发布了23 篇原创文章 · 获赞 40 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章