在 Java 中,JNI(Java Native Interface)用于在 Java 代码中调用本地(Native)代码,通常是 C 或 C++代码。以下是几种使用 JNI 的常见方式,每种方式都包括步骤流程和相应的示例代码。
步骤流程:
javac
编译 Java 类生成 .class
文件。javah
生成 C/C++头文件。.dll
、 .so
等)。示例代码:
创建 Java 类(HelloJNI.java):
public class HelloJNI {
static {
System.loadLibrary("hello"); // 加载本地库
}
public native void sayHello(); // 声明本地方法
}
编译 Java 类并生成.class 文件:
javac HelloJNI.java
使用 javah 生成头文件(命令需在类文件所在目录执行):
javah HelloJNI
实现 C/C++本地库(hello.cpp):
#include <jni.h>
#include "HelloJNI.h"
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject obj) {
printf("Hello from C++!\n");
}
编译生成动态链接库(示例使用 Linux 为例,其他平台类似):
g++ -shared -o libhello.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux hello.cpp
在 Java 中调用本地方法:
public class Main {
public static void main(String[] args) {
HelloJNI hello = new HelloJNI();
hello.sayHello();
}
}
步骤流程:
.i
)。示例代码:
编写接口定义文件(hello.i):
%module hello
%{
#include "hello.h"
%}
%include "hello.h"
使用 SWIG 生成 JNI 封装代码:
swig -java -c++ -outdir generated -o hello_wrap.cpp hello.i
public class Main {
public static void main(String[] args) {
Hello hello = new Hello();
hello.sayHello();
}
}
步骤流程:
com.sun.jna.Library
。示例代码:
创建 Java 接口(HelloJNA.java):
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface HelloJNA extends Library {
HelloJNA INSTANCE = Native.load("hello", HelloJNA.class);
void sayHello();
}
在 Java 中调用本地方法:
public class Main {
public static void main(String[] args) {
HelloJNA.INSTANCE.sayHello();
}
}
依赖坐标:
Maven:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.10.0</version>
</dependency>
Gradle:
implementation 'net.java.dev.jna:jna:5.10.0'
请注意,每种方法都有其适用的场景和优缺点。选择最适合你需求的方法,然后根据上述步骤进行实现。上述示例中的库名、文件名等可能需要根据你的项目结构进行调整。