如何通過 JNI 介面呼叫本機庫中的函式

Java 本地介面 (JNI)允許你從 Java 程式碼,反之亦然呼叫本機的功能。此示例顯示如何通過 JNI 載入和呼叫本機函式,它不會使用 JNI 函式從本機程式碼訪問 Java 方法和欄位。

假設你在 project/libs/<architecture> 資料夾中有一個名為 libjniexample.so 的本地庫,你想從 com.example.jniexample 包中的 JNITestJava 類呼叫一個函式。

在 JNITest 類中,宣告如下函式:

public native int testJNIfunction(int a, int b);

在你的本機程式碼中,定義如下函式:

#include <jni.h>

JNIEXPORT jint JNICALL Java_com_example_jniexample_JNITest_testJNIfunction(JNIEnv *pEnv, jobject thiz, jint a, jint b)
{
    return a + b;
}

pEnv 引數是一個指向 JNI 環境的指標,你可以將其傳遞給 JNI 函式以訪問 Java 物件和類的方法和欄位。thiz 指標是對呼叫本機方法的 Java 物件的 jobject 引用(如果它是靜態方法,則為類)。

在你的 Java 程式碼中,在 JNITest 中,像這樣載入庫:

static{
    System.loadLibrary("jniexample");
}

注意開頭的 lib,省略檔名末尾的 .so

從 Java 呼叫本機函式,如下所示:

JNITest test = new JNITest();
int c = test.testJNIfunction(3, 4);