You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打包生成可被Java loadlibrary()调用的.dll文件?

如何将C代码编译为供Java调用的.dll文件(基于GCC)

一、确认JNI代码符合规范

  • 所有C代码必须包含JDK提供的jni.h头文件
  • 本地方法的函数名必须严格遵循JNI签名格式:Java_包名_类名_方法名(包名中的.替换为_),比如你提供的chinesechess_database_Database.c里的函数,需对应Java中chinesechess.database.Database类的native方法

二、编译生成目标文件(.o)

使用你给出的GCC命令编译C源码为目标文件,各参数作用如下:

g++ -m64 -c -O3 -I "C:\Program Files\Java\jdk-10.0.2\include" -I "C:\Program Files\Java\jdk-10.0.2\include\win32" chinesechess_database_Database.c myjni_Utilities.c
  • -m64:编译生成64位目标文件(需与你的JDK位数一致,若用32位JDK则改为-m32)
  • -c:仅编译源码,不进行链接操作,生成.o后缀的目标文件
  • -O3:开启最高级别代码优化
  • -I:指定头文件搜索路径,必须包含JDK的include和include/win32目录,因为jni.h依赖该目录下的jni_md.h

三、链接生成.dll文件

编译完成后,将生成的.o目标文件链接为可被Java加载的动态链接库:

g++ -m64 -shared -o MyJNI.dll chinesechess_database_Database.o myjni_Utilities.o
  • -shared:指定生成共享库(即Windows下的.dll文件)
  • -o MyJNI.dll:指定输出的.dll文件名,后续Java加载时会用到这个名称(Windows下无需加lib前缀)

四、Java中调用.dll文件

  1. 在Java类中声明native方法,示例:
package chinesechess.database;

public class Database {
    // 声明native方法,需与C中函数名对应
    public native void someNativeMethod();

    static {
        // 加载生成的.dll文件,填写文件名(不含.dll后缀)
        System.loadLibrary("MyJNI");
    }

    public static void main(String[] args) {
        new Database().someNativeMethod();
    }
}
  1. 确保.dll文件能被Java找到:
    • 将.dll文件放在Java项目的根目录下
    • 或者将.dll所在路径添加到系统PATH环境变量
    • 也可以使用System.load("C:\\path\\to\\MyJNI.dll")直接指定绝对路径加载

注意事项

  • 位数匹配:JDK的位数(32/64位)必须与编译的.dll位数完全一致,否则会加载失败
  • 函数签名:C中的函数名、参数类型必须与Java native方法的签名严格对应,否则会抛出UnsatisfiedLinkError
  • 路径空格:如果JDK路径包含空格,必须用引号包裹,避免编译报错

内容的提问来源于stack exchange,提问作者lance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:13:34