1. 程式人生 > >Android Studio使用NDK編譯自己的.so庫

Android Studio使用NDK編譯自己的.so庫

我們知道,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下加入

 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庫。目前可有可無
        }
    }
2、在gradle.properties裡新增
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);