Android Studio 手把手教你利用NDK打包SO庫檔案,并提供對應API (封裝Jar包)使用它(附demo)
本篇文章代碼一步一步實作打包so并使用:
- 下載下傳NDK
- 配置NDK環境變量
- 建立工程開始JNI編寫
- 指令行編譯JNI
- 配置gradle打包到指定目錄
- 導出So檔案使用
一、下載下傳NDK
- 進入設定頁面
- 下載下傳NDK,此處是我已經下載下傳過後自動配置好路徑了,如果沒下載下傳過,紅色方框會有download ndk ,點選下載下傳即可
二、配置NDK
如圖在系統環境變量path中添加以下路徑:
測試配置:打開Android studio ,在整個工程的gradle.properties檔案中添加droid.useDeprecatedNdk=true
打開終端,輸入ndk-build回車,若有資訊輸出則配置成功
三、建立Library Module,穿件Jni本地代碼并實作功能方法之是以穿件Library Module是應為我們不僅要編譯出so,同時要導出使用so配套的api,将這些api導出成jar包提供給使用者使用,詳細見下文。
在nativeif建立兩個本地功能的類(先忽略api,這是打包so後使用so的api)
NativeTest 代表一個子產品的本地方法類,NativeCalculate代表另一個功能子產品的本地方法類,在此以加法功能子產品舉例
build本module,看看是否存在以下目錄
打開終端,定位到你module的src\main目錄,執行指令如下
javah -d jni -classpath C:\FrostySpace\Work\SDK\platforms\android-25\android.jar;….\build\intermediates\classes\debug com.winshare.cloud.jnilibrary.nativeif.NativeCalculate
說明:javah是jdk工具,請事先配置好環境變量。-d jni代表輸出目錄jni;一個android.jar替換成你的sdk下版本路徑,記得有“;”後面則是build後生成的本地class路徑最後隻寫類名,不用.class字尾,
回車後會自動生成jni目錄,裡面包含一個以下劃線代替包名點和類名方法名的對應頭檔案
建立c檔案,用c語言實作add的方法
四、将JNI代碼打包成SO庫
在jni目錄下建立Application.mk和Android.mk檔案。Application.mk内容如下:
這裡主要是APP_ABI值 armeabi-v7a支援性好,如果多個可疑後面空格繼續添加其他平台,輸出so也将是多個平台的so。
Android.mk内容如下:
1處代表so到處名稱,2處事要編譯打包的c原檔案,多個檔案用“\”分開。其他内容照寫即可。
準本好這些後,在終端(還是在src\main\)目錄下輸入”ndk-build” ,即可打包出so(注意打包出來會在你配置的名稱前自動加上lib,我們不用管,使用的時候也不要把lib去掉)。此時會在main目錄下生成libs和obj目錄,我們用libs目錄下對應平台的so即可。如圖:
五、提供對接SO庫的api,封裝成jar,使用者就可以友善的通過我們提供的api調用so中方法。
在同一mudule中編寫api并導出jar,目的是同意api和so庫中的方法名稱(即通過報名下劃線命名),api通路so才不會出現找不到對應方法的錯誤,我們将libs下的armeabi-v7a整體備份。
我們可以删除剛剛工程中打包so過程中産生的lib錄
删除後的目錄如下,并在api包中建立對應功能類,調用so中方法
建立NativeAPP初始化加載so庫檔案,記得名稱不要寫so前面的lib
六、将api到出位jar包,具體到處配置見工程源碼gradle,如圖點選JniLibrary編譯下的other子產品下面的makeJar生成jar在對應目錄(jarGenerated)。
makJar生成包:
七、使用api和對應的so。
建立測試module,将第六步到處的jar放在module的libs目錄,将第四步備份的so放在module的java同級目錄jniLibs(自己建立)下即可,如圖:
代碼中使用如下:
在使用提前加載so庫檔案,其他地方使用即可:
結束語:源碼點此下載下傳
有時間的話能一步一步走一遍最好,有問題可留言,多謝!