背景:公司其他部门提供了一些c语言写的方法 用ndk封装成了 so文件 我们Android上层app需要调用
开始:
第一步:拷贝so文件到AS工程
这里注意 如果你是放在module的 libs下 还要在module的build.gradle中 android{}里面加上这个配置
sourceSets { main { ... jniLibs.srcDirs = ['libs'] } }
第二步:关键步骤
创建一个和so内部包路径相同的package 比如我这里是stl.star***s 然后 把第三方提供的java文件放进去
这里说的so内部包路径就是第三方提供的这个java文件 第一行代码 package ***
还有一个办法可以看到包路径,就是跟对方要到 .h文件
这个.h文件中 最上面 找到类似 #ifndef _Included_stl_star***_***MultiClient,这里的stl、star***拼起来 stl.star*** 就是包路径了 后面的***MultiClient 就是java类名
如果对方没有给你提供java文件(应该提供的,总得提供接口文档吧)就把接口文档中的方法写在 你建的java类里面 如下图的
public static native 方法
然后在用的地方 直接调用就可以了 ***MultiClient.xxxInit("传入参数")
这里说一个注意问题,就是第三方给你提供的so如果没有包路径,那就按照这套步骤无法集成了,因为你不知道把java文件放哪里,此时 应该让对方提供一个带包路径(package)的java文件,如何做到呢?
就是对方在第一步写java文件的时候 先在本地盘里面创建一个目录 这个目录就是包路径 比如创建stl文件夹 再在文件夹里面创建 star*** 文件夹 然后目录创建好后 在里面创建***MultiClient.java文件
然后javac编译成 class 然后 javah编译出来 .h文件 然后.c去实现 然后ndk编译成 so