Java JNI 快速入门:从编写到编译动态链接库全流程
当 Java 难以满足实时性要求或需要调用系统底层能力时,可以使用 JNI(Java Native Interface)来加载和调用现有的本地库(如 C/C++ 开发的程序)。本教程以在字符串 "world" 前添加 "hello" 为例,详解从编写 Java native 方法到编译生成 Windows DLL 动态链接库的全过程。
结果与目标
完成一个包含 native 方法的 Java 程序,成功加载由 C 语言编写的本地动态库,并在控制台输出拼接后的字符串 "helloworld"。
准备条件
- 操作系统:Windows 64位
- JDK 版本:JDK 1.8
- 编译器:MinGW64 (GCC)
真实操作顺序
第1步:编写带有 native 方法的 Java 类
目的:定义需要本地实现的接口,并在 main 方法中测试调用。
动作:创建 Test.java 文件,代码如下:
public class Test {
// 声明 native 方法
public native String helloworld(String text);
public static void main(String[] args) {
// 加载动态库名称,Windows 下对应 Test2.dll
System.loadLibrary("Test2");
Test ts = new Test();
// 调用 native 方法
String text = ts.helloworld("world");
System.out.println(text);
}
}
第2步:编译 Java 源代码
目的:生成 .class 字节码文件,用于后续生成头文件。
入口:命令行终端(cmd)。
动作:执行 javac 命令。
javac Test.java
第3步:生成 JNI 头文件
目的:获取 Java 方法与 C 语言函数对应的签名和结构。
入口:命令行终端(cmd),需在与 .class 文件相同的目录下执行。
动作:执行 javah 命令生成头文件。
javah Test
生成的 Test.h 文件关键内容如下:
#include <jni.h>
JNIEXPORT jstring JNICALL Java_Test_helloworld(JNIEnv *, jobject, jstring);
参数说明:
- JNIEnv*:提供 JNI 函数的指针。
- jobject:Java 对象实例本身。
- jstring:Java 传入的字符串参数。
第4步:编写 C 语言实现逻辑
目的:实现头文件中声明的函数,处理字符串转换与拼接。
动作:创建 Test2.c 文件,引入生成的头文件并实现逻辑:
#include "Test.h"
#include <string.h>
JNIEXPORT jstring JNICALL Java_Test_helloworld
(JNIEnv *env, jobject obj, jstring string) {
// 将 Java UTF-16 字符串转换为 C 编码格式
const char* str = (*env)->GetStringUTFChars(env, string, 0);
char cap[128];
strcpy(cap, "hello");
strcat(cap, str);
// 释放本地字符串资源,防止内存泄漏
(*env)->ReleaseStringUTFChars(env, string, 0);
// 返回新的 Java 字符串
return (*env)->NewStringUTF(env, cap);
}
关键细节:
- Java 字符占用双字节,C 语言为单字节,必须使用 GetStringUTFChars 进行转换。
- 调用完本地字符串后,务必使用 ReleaseStringUTFChars 释放内存,否则会导致内存泄漏。
第5步:编译与运行
目的:将 C 源代码编译为 Windows 动态链接库 (.dll),并验证 Java 程序能否正确调用。
动作:使用 GCC 编译。
gcc -I "D:\Program Files\Java\jdk1.8.0_45\include" \
-I "D:\Program Files\Java\jdk1.8.0_45\include\win32" \
--share Test2.c -o Test2.dll
注意:
- -I 参数指向 JDK 安装目录下的 include 路径。
- Windows 系统下输出后缀应为 .dll,Linux 则为 .so。
第6步:执行测试
动作:在当前目录运行 Java 类。
java Test
预期结果:
控制台打印:helloworld
简要总结
本文介绍了 Java JNI 的基本流程:首先编写含 native 方法的 Java 类,编译生成 class 文件;其次通过 javah 生成头文件;接着用 C/C++ 实现逻辑(需注意字符集转换和资源释放);最后编译成动态库供 JVM 加载。了解此流程有助于扩展 Java 在处理底层系统交互时的能力。
以上就是Java的JNI快速入门教程(推荐)的详细内容,更多关于Java本地接口调用的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









