天天看點

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,首次寫部落格,有什麼不對的地方,請多多指教。有問題請留言。