JNI(Java Native Interface)是Java平台标准版(Java SE Platform)的一部分,它允许Java代码与其他语言写的代码进行交互。下面是一个简单的JNI示例,这个示例展示了如何在Java中调用一个用C/C++编写的本地方法。
- 编写Java类
首先,我们创建一个Java类,该类声明了一个本地方法。
java
// NativeDemo.java
public class NativeDemo {
// 声明本地方法
public native void nativeMethod();
// 加载包含本地方法实现的动态链接库
static {
System.loadLibrary("NativeImpl");
}
public static void main(String[] args) {
new NativeDemo().nativeMethod();
}
}
- 生成JNI头文件
接下来,我们需要使用javah工具生成JNI头文件。这个工具是JDK的一部分,可以从Java类生成C头文件和源文件。
首先,编译Java类:
powershell
bash
javac NativeDemo.java
然后,使用javah生成头文件:
bash
javah -jni NativeDemo
这将生成一个名为NativeDemo.h的头文件。
- 实现本地方法
现在,我们需要在C/C++中实现本地方法。创建一个C文件,并包含生成的头文件。
cpp
// NativeDemo.c
#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativeDemo_nativeMethod(JNIEnv *env, jobject obj) {
printf("Hello from native code!\n");
return;
}
- 编译和链接本地代码
现在,我们需要编译和链接C代码以生成动态链接库。这取决于你的操作系统和编译器。以下是一个在Linux上使用GCC的示例:
powershell
gcc -shared -fpic -o libNativeImpl.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux NativeDemo.c
确保将${JAVA_HOME}替换为你的Java安装目录。
- 运行Java程序
最后,设置LD_LIBRARY_PATH环境变量以包含你的动态链接库,然后运行Java程序。
powershell
export LD_LIBRARY_PATH=.
java NativeDemo
你应该会看到输出"Hello from native code!"。