Android studio 打包C/C++代码 到so库 生成jar包

打包环境

Linux ubuntu

测试环境

Windows

IDE

Android studio

创建c++项目

uTools_1645068192897.png

相对于平常的项目多了一个cpp文件夹

点击MainActivity中的stringFromJNI方法,即可跳转到 native-lib.cpp的对应方法

uTools_1645068453624.png

uTools_1645068674362.png

按照 示例代码 在MainActivity中写一个public native String hello();,对应的cpp文件会生成Java_com_example_sotest_MainActivity_hello(JNIEnv *env, jobject thiz)方法,自己写一个返回值

uTools_1645068781106.png
uTools_1645068871720.png
uTools_1645069000399.png

此时我们就可以编译我们自己的.so库了,点击AS工具栏的Build->Make Project,编译工程后,在目录app->build->intermediates->cmake->debug->obj->下可以找到不同架构下的.so文件,如图

uTools_1645069125150.png

接下来生成对外提供的jar文件

创建一个HelloJni文件,将MainActivity中方法剪切过来

uTools_1645069361135.png

此时这两个方法是报红的,打开native-lib.cpp文件,将MainActivity全局替换为HelloJni

uTools_1645069486463.png

再调整下MainActivity的代码,这样就不会报错了,从新make下.在app下的build.gradle文件下添加如下代码

uTools_1645076322390.png
 task deleteOldJar(type: Delete){
    //删除上次生成的
     delete 'build/libs/jni.jar'
}
task makeJar(type: Jar){
    //生成的文件名
    baseName 'JniLib'
    //这个路径需要自己找,版本不同会有不同的路径
    from('build/intermediates/javac/release/classes/')
    //这个是选择上面的路径下的需要打包的文件路径
    include('com/example/sotest/HelloJni.class')
}
makeJar.dependsOn(deleteOldJar, build)

com.android.application 修改为com.android.library,注释applicationId

uTools_1645075826918.png

在AS的右侧Gradle标签点开,app-->Tasks-->other中可以找到一个makeJar的任务,双击执行.

如果没有task,则打开settings-->Experimental取消Gradle下的Do not build Gradle task list during Gradle sync


uTools_1645076520117.png

uTools_1645076639766.png
uTools_1645076779862.png

将app->build->intermediates->libs->JniLib.jar和app->build->intermediates->cmake->debug->obj目录下的各个架构的so都复制下来,放到别的项目中的libs下

C5AC6C3E-769C-4b71-B54D-0A9C8E9F95D5.png

大功告成~~

你可能感兴趣的:(Android studio 打包C/C++代码 到so库 生成jar包)