java 如何用jni
使用JNI(Java Native Interface)的步骤
准备工作
确保已安装JDK和本地开发工具(如GCC或Visual Studio)。JDK需包含javah(旧版本)或javac -h(JDK 10+)工具。
编写Java类
在Java类中声明native方法,并加载动态库:
public class JNIDemo {
static {
System.loadLibrary("nativeLib"); // 加载libnativeLib.so或nativeLib.dll
}
public native void sayHello(); // 声明native方法
public static void main(String[] args) {
new JNIDemo().sayHello();
}
}
生成头文件
使用javac -h生成C/C++头文件:

javac JNIDemo.java
javac -h . JNIDemo.java
生成的头文件(如JNIDemo.h)包含类似以下内容:
JNIEXPORT void JNICALL Java_JNIDemo_sayHello(JNIEnv *, jobject);
实现Native代码
编写C/C++文件(如JNIDemoImpl.c)实现头文件中的函数:

#include "JNIDemo.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_JNIDemo_sayHello(JNIEnv *env, jobject obj) {
printf("Hello from JNI!\n");
}
编译动态库
根据平台编译动态库:
- Linux/macOS:
gcc -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux JNIDemoImpl.c -o libnativeLib.so - Windows(使用Visual Studio或MinGW):
cl /I"%JAVA_HOME%\include" /I"%JAVA_HOME%\include\win32" /LD JNIDemoImpl.c /FenativeLib.dll
运行Java程序
确保动态库在java.library.path中,或通过-Djava.library.path=指定路径:
java -Djava.library.path=. JNIDemo
关键注意事项
- 命名规范:JNI函数名需严格遵循
Java_ClassName_MethodName格式。 - 数据类型映射:注意Java与C/C++数据类型的转换(如
jint对应int)。 - 内存管理:JNI中局部引用需手动释放,避免内存泄漏。
高级用法
- 传递参数:通过JNIEnv方法(如
GetStringUTFChars)处理字符串等对象。 - 异常处理:使用
ThrowNew抛出Java异常。 - 多线程:注意JNIEnv与线程的绑定关系。






