1. 程式人生 > >[android ndk]android studio動態庫生成及jni底層呼叫步驟

[android ndk]android studio動態庫生成及jni底層呼叫步驟

android studio動態庫生成及jni底層呼叫步驟

1、建立一個用於關聯c程式碼的類(對映類)

方法名需要加native修飾

public class NDKUtils {
    public static native int getSum(int a, int b);
}

2、使用javah生成標頭檔案【可選】–>目的是為了拿到函式的宣告

進入到app\src\main\java ,使用javah 全類名(上面建立的對映類,不要有中文註釋)

找到生成的c檔案拿到函式宣告(注意此處是沒有引數名的哦):

JNIEXPORT jint JNICALL Java_com_jwkj_ffmpeg_NDKUtils_getSum
  (JNIEnv *, jclass, jint, jint);

3、建立c實現的檔案(eg:ndkutils.c)

android studio切換到Project預覽模式,找到src/main,新建jni資料夾,然後新建一個對應的c檔案,將上面拿到的函式宣告拷貝到c檔案中。(記得自己帶上引數名,如env clazz a b)

#include "stdio.h"
#include "jni.h"

JNIEXPORT jint JNICALL Java_com_jwkj_ffmpeg_NDKUtils_getSum
(JNIEnv *env, jclass clazz, jint a, jint b) {
    return a+b;
}

4、配置gradle

找到app的gradle,在defaultConfig裡面新增:

ndk {
        moduleName "ndkDemo" //生成的so庫名字
        abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結構下的so庫。
 }

5、Make Project

Make成功之後,即可在app/build/intermediates/ndk下產生so動態庫檔案

6、為對映類關聯庫檔案

1、在src/main下面建立jniLibs資料夾;

2、將動態庫檔案(連同資料夾一起)拷貝到src/main

public class NDKUtils {
    static {
        System.loadLibrary("ndkDemo");
    }
    public static native int getSum(int a, int b);
}

3、此時可以將jni目錄下的程式碼全部刪除(已經不需要)

4、最後的目錄結構圖和gragle配置圖

7、使用ndk

public class MainActivity extends AppCompatActivity {

private TextView tvReuslt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tvReuslt = (TextView) findViewById(R.id.tv_result);
    tvReuslt.append(NDKUtils.getSum(4, 2) + "");
}
}

執行結果: