详解Java 本地接口 JNI 使用方法

JNI全称Java Native Interface,它是Java语言调用非Java语言(如C、C++等)的接口,通过这个接口可以让Java程序获得底层操作系统平台的原生支持。

详解Java本地接口JNI使用方法

什么是JNI?

JNI全称Java Native Interface,它是Java语言调用非Java语言(如C、C++等)的接口,通过这个接口可以让Java程序获得底层操作系统平台的原生支持。

如何使用JNI?

JNI的使用步骤可以分为几个步骤:

  1. 编写Java程序
  2. 编写本地方法
  3. 生成.h头文件
  4. 编写C/C++程序
  5. 生成动态链接库
  6. 在Java程序中调用本地方法

1. 编写Java程序

在Java程序中声明native方法,例如:

public native void printHelloWorld();

2. 编写本地方法

在本地方法中实现Java程序中声明的native方法,例如:

JNIEXPORT void JNICALL Java_com_example_MyClass_printHelloWorld(JNIEnv *env, jobject jobj) {
    printf("Hello World!\n");
}

3. 生成.h头文件

使用Java JDK提供的工具javah,将Java程序中声明的native方法生成对应的.h头文件,例如:

javah -jni com.example.MyClass

4. 编写C/C++程序

根据生成的.h头文件,编写对应的C/C++程序实现本地方法,例如:

#include "com_example_MyClass.h"

JNIEXPORT void JNICALL Java_com_example_MyClass_printHelloWorld(JNIEnv *env, jobject jobj) {
    printf("Hello World!\n");
}

5. 生成动态链接库

将C/C++程序编译生成动态链接库,例如:

gcc -shared -fpic -o libhello.so HelloWorld.c

6. 在Java程序中调用本地方法

在Java程序中调用本地方法,例如:

public class MyClass {
    static {
        System.loadLibrary("hello");
    }

    public native void printHelloWorld();

    public static void main(String[] args) {
        new MyClass().printHelloWorld();
    }
}

示例说明

以下是两个示例说明。

示例一:Java调用C++代码实现数组求和

Java程序调用C++代码实现数组求和,示例代码如下:

Java代码

public native int sumArray(int[] arr);

C++代码

JNIEXPORT jint JNICALL Java_com_example_MyClass_sumArray(JNIEnv *env, jobject obj, jintArray arr) {
    jint* arr_ptr = env->GetIntArrayElements(arr, 0);
    jsize len = env->GetArrayLength(arr); 
    int sum = 0;
    for (int i = 0; i < len; i++) {
        sum += arr_ptr[i];
    }
    env->ReleaseIntArrayElements(arr, arr_ptr, 0);
    return sum;
}

示例二:Java调用C代码执行Linux命令

Java程序调用C代码执行Linux命令,示例代码如下:

Java代码

public native void runCommand(String command);

C代码

JNIEXPORT void JNICALL Java_com_example_MyClass_runCommand(JNIEnv *env, jobject obj, jstring command) {
    const char* cmd = env->GetStringUTFChars(command, 0);
    system(cmd);
    env->ReleaseStringUTFChars(command, cmd);
}

结语

通过这篇攻略,您已经掌握了如何使用Java本地接口JNI调用非Java语言的能力。希望您在实际开发工作中能够熟练应用。

本文标题为:详解Java 本地接口 JNI 使用方法

基础教程推荐