转自:http://zwz94.blog.163.com/blog/static/3206039520131111101412959/


问题描述:Android如何调用第三方SO库;
已知条件:SO库为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共享库;
求解:
1.上面两种方案是否可行?不可行的话存在什么问题?
2.两种方案有什么区别?为什么网上大部都是用的第二种方案?
3.只有一个*.so文件,并提供了详细的接口说明,是否可在ANDROID中使用它?


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

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

一般如果你只有SO,就说明这个是别人提供给你的,你可以要求对方给你提供配套的JAVA调用文件。

1、这个要看这个SO是不是符合JNI调用的规范。还要看你自己的意愿。
2、因为第二种方法最灵活,各种情况都可以实现。
3、可以

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

1、检查所需文件是否齐全 使用第三方动态库,应该至少有2个文件,一个是动态库(.so),另一个是包含 动态库API声明的头文件(.h) 2、封装原动态库 原动态库文件不包含jni接口需要的信息,所以我们需要对其进行封装,所以我 们的需求是:将libadd.so 里面的API封装成带jni接口的动态 3、编写库的封装函数libaddjni.c 根据前面生成的com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用 来生成libaddjni.so

Android Studio Jni的so文件放在jniLibs,Eclipse在libs目录下。 so文件位置更换后clean一下再运行。

更多相关文章

  1. android之selector使用
  2. android 引入jni 的so库的方法
  3. android studio template模块开发
  4. ANDROID Porting系列二、配置一个新产品
  5. 一步一步学习androidNDK编程(java给c传递数据)
  6. Android(安卓)init 启动过程分析
  7. Native+WebApp中Phonegap调用Android(安卓)Activity
  8. android背景选择器selector用法
  9. Android(安卓)Studio 之 AndroidManifest.xml文件中的android:la

随机推荐

  1. service(改)
  2. Android使用ttf字体库替代替图片
  3. android intent-filter category.DEFAULT
  4. 网络获取图片的方法的重写--较简洁(如果
  5. Android聊天机器人
  6. 谈谈最近很火的android手机病毒
  7. Android(安卓)NDK安装及使用简介
  8. Google 以 Flutter 作为原生突破口,移动端
  9. 成为android工程师的30+个小技巧
  10. Android输入系统(一)输入事件传递流程和Inp