JNI(Java Native Interface,Java 本地接口)是一种编程框架,使得 JVM 中的 Java 程 序可以调用本地应用或库,也可以被其他程序调用。本地程序一般是用其它语言(C、C++或 汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序。
示例:通过 JNI 调用 C 函数
public class HelloWorld {
// 声明本地方法
public native void printHelloWorld();
static {
// 加载本地库
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().printHelloWorld();
}
}
Code Snippet 1:
Java 代码
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h" // 通过 javac 生成的头文件
// 实现本地方法
JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld(JNIEnv *env, jobject obj) {
printf("Hello, World from C!\n");
}
Code Snippet 2:
C 代码
编译和运行
-
编译 Java 代码
javac HelloWorld.java
-
生成 C 头文件
javac -h . HelloWorld.java
-
编译 C 代码为共享库
在 Linux 和 macOS 上,使用 gcc 或 clang 编译 C 代码:
gcc -shared -o libhello.so -fPIC HelloWorld.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
在 Windows 上,使用 cl 编译器:
cl /LD HelloWorld.c /I"%JAVA_HOME%\include" /I"%JAVA_HOME%\include\win32" /Fehello.dll
这将生成一个共享库文件,在 Linux 和 macOS 上是 libhello.so,在 Windows 上是 hello.dll。
-
运行 Java 程序
java -Djava.library.path=. HelloWorld