如何通过 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);