Java JNI 快速入门:从编写到编译动态链接库全流程

Dylan
Dylan
发布时间:2026-10-13| 3人浏览过
原创

当 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本地接口调用的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。