Android Studio使用NDK編譯自己的.so庫
阿新 • • 發佈:2019-01-26
我們知道,Android架構中上層應用是以java來編寫的,而底層則用C/C++編寫。一般而言,上層android工程師在開發過程中,不會或很少涉及到C/C++層,但專案中一旦涉及到複雜的演算法或耗時操作時(例如影象處理等),通常使用C/C++完成演算法實現並提供給java層(通過JNI)呼叫,以此提升軟體的執行效率。在這個過程中,C/C++所實現的程式碼以及JNI呼叫相關的程式碼被打包為.so庫,這即是所謂的目錄裝置上的二進位制動態庫(SHARED LIBRARY),而且.so庫更安全,不容易被反編譯。那麼如何打包自己的.so庫呢?
一、在Android studio 中配置NDK
在電腦的環境變數中加入NDK的路徑
測試
成功!!!OK。
二、新建一個工程,先做一下配置
1、在app的build.gradl下加入
2、在gradle.properties裡新增defaultConfig { applicationId "jni.svse.com.jnitest2" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk{ moduleName "NDKDEMO" //生成的so名字 ldLibs "log", "z", "m" //連結時使用到的庫 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。目前可有可無 } }
android.useDeprecatedNdk=true
3、在main下新建一個JNI資料夾
會生成jni資料夾
三、新建呼叫C/C++的類
public class Load {
static {
System.loadLibrary("NDKDEMO");//NDKDEMO可以隨便取,但是必須和moduleName "NDKDEMO" 的名字一樣
}
public static native int Add(int a,int b);
}
此時Add會出現紅色,不要緊,Alt+Enter,android studio會在jni下自動幫你生成NDKDEMO.c
#include <jni.h>
JNIEXPORT jint JNICALL Java_jni_svse_com_jnitest2_Load_Add(JNIEnv *env, jclass type, jint a, jint b) { // TODO在這裡編寫你的邏輯程式碼,我這裡是相加 return a+b; }
此時還沒有生成.so庫
以上2步後會在以下路徑生成你的.so庫了
生成的型別是根據以下紅色來的
ndk{
moduleName "NDKDEMO" //生成的so名字
ldLibs "log", "z", "m" //連結時使用到的庫
abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。目前可有可無
}
有了自己的.so庫怎麼使用呢
在新建一個工程,把.so庫放到jniLibs下,在工程下新建一個和.so庫包名一樣的Package,Java_jni_svse_com_jnitest2_Load_Add包名是jni.com.jnitest2,然後再把上面的Load 複製到這裡,在Activity裡就可以使用了
int value=Load.Add(23, 5);