天天看点

Android——JNI项目使用Cmake打包生成.so库和jar包

         最近项目中需要将当前开发的JNI项目封装成SDK的形式供第三方app调用,而且我当前项目还引用了外部静态库。大家都知道java的代码可以以Module的形式打包成jar包,而jni中C或C++的代码可以输出so动态库,那么这俩如何结合起来也是个问题。看了很多文章,因为了解不多,以为这个是很复杂的事情,自己研究了一下才发现还是挺简单的。

         一、首先项目是要把项目转换为Module的形式。需要先把项目转为library供别的项目依赖,然后再获得jar包。主要流程:

         1.先将自己的项目改为library,在app下的build.gradle下修改application为library。

         2.再将applicationId注销。

         3.sync一下,就可以把项目作为Module导入到另一个工程中了。

(参考:https://blog.csdn.net/garyhu1/article/details/76811947)

         二、将项目作为Module导入到另一个工程中。

      三、将外部库及C或C++核心代码生成.so动态库。在{ModuleName}\build.gradle中配置需要的arm版本,在defaultConfig中加入下面的配置项

         ndk{

              abiFilters 'armeabi', 'x86', 'armeabi-v7a'//可根据自己需要的情况调整

         }

         Bulid->Make Project一下,编译完成后就可以在{ModuleName}\mobilesdk\build\intermediates\cmake\debug\obj目录下找到编译出对应版本的动态库啦。

Android——JNI项目使用Cmake打包生成.so库和jar包

         四、将java中调用jni的代码打包为jar包。敲黑板,在打包之前,很重要的步骤:jni项目是需要加载编译的动态库的,即static {    System.loadLibrary("native-lib");    }这段代码,这个一般都是默认在MainActivity中的,在这里,根据实际情况将加载动态库这段代码移到定义本地native方法的类,否则输出的jar包调不到so。这里动态库的名称可以根据自己情况随意修改为lib***.so,当然加载的地方要和so名称一致。接下来就是输出jar包,打包的方式有很多种,这里我就说一下我打包的方法。在{ModuleName}\build.gradle中配置输出jar的名称,jar包输出路径等。

         task makeJar(type: Copy) {

             delete'build/libs/myJar.jar' //删除原来的jar包

             from('build/intermediates/bundles/default/')//编译出jar包原地址

             into('build/libs/')//指定输出的jar包的路径

             include('classes.jar')//输出的原jar包

             rename('classes.jar', ' myJar.jar ') //自定义输出的jar包名称

         }

        makeJar.dependsOn(build)

配置好后,Terminal中键入 gradlewmakeJar 即可生成命名为myJar.jar的jar包。

         五,在工程中调用。将输出的myJar.jar复制到app/libs目录下,并在build.gralde中配置dependencies,加入compilefiles('libs/myJar.jar')。在app/src/main目录下新建文件夹jniLibs,将第三步生成的各版本so复制到新建的目录下,就可以通过调用jar包调用到C或C++中的方法了。

         是不是很easy,首次写博客,有什么不对的地方,请多多指教。有问题请留言。