我们知道JNI开发无论是静态注册还是动态注册,都会有跟相关包名类名绑定的情况,因此无法在其他项目正确引用,解决此问题一般是采用编写一个对应的接口java类,将so一并打包成jar,即可供开发者正确使用。
本文主要目的: 用于解决生成的.so库中,jni的方法名有包名的限制,导致其他项目工程引用时,包名不一致,出现jni层接口调用无效的问题。
1、新建Android Library
在project面板,项目名称右键–>new–>Android Library,输入名字(jniTest)即可生成对应的moudle
2、然后到路径jniTest/src/main/java下可找到刚才创建的项目,如上图中的com.example.mylibrary,然后创建自己的接口类,右键new–>java class
3、导入jni文件,指定android.mk文件,然后build moudle一下
以上具体步骤可参考:
Android Studio jni动态注册步骤
4、配置并生成jar文件
在jniTest这个module下的build.gradle的末尾添加如下配置信息:
def SDK_NAME = "JniUtil"; //sdk的名字
def SDK_VERSION = "_V1.0"; //版本
def sdkDestinationPath = "build";
def zipFile = file('build/intermediates/bundles/release/classes.jar')//注意这里的release可能是debug或者是default
task deleteBuild(type: Delete) {
//最终生成的jar的名字
delete sdkDestinationPath + SDK_NAME + SDK_VERSION + ".jar"
}
task makeJar(type: Jar) {
from zipTree(zipFile)
from fileTree(dir: 'src/main',includes: ['assets/**'])
baseName = SDK_NAME + SDK_VERSION
destinationDir = file(sdkDestinationPath)
}
makeJar.dependsOn(deleteBuild, build)
添加完后 点击右上角的Sync Now,没有报错即可
5、接下来在Android Srudio的Gradle窗口(右侧),找到项目名称–>module名称–>Tasks–>other–>makeJar(Gradle窗口左上角的刷新按钮进行刷新),双击
全是绿色的话,即可生成对应的jar文件,路径为:moduleName/build/下
此时打开jar文件,可以看到已经包含了我们的接口类,但是没有包含我们生成的so文件。
6、打包so文件进入jar
在路径moduleName/src/main下新建Folder–>Assets Folder,然后将jni/lib/下的架构文件copy到刚才创建的assets文件夹中,再次点击makeJar,同样的路径下,我们可以看到生成的jar已经包含了我们的so