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

Java调用非自制DLL函数报错UnsatisfiedLinkError如何解决?

解决Java调用第三方DLL的UnsatisfiedLinkError问题

问题根源

第三方DLL的导出函数名、调用约定(如__stdcall/__cdecl)与JNI默认生成的函数签名不匹配,导致JVM无法找到对应函数。

解决方案

方案一:用JNA直接映射(推荐,无需手写JNI代码)

JNA可以绕过JNI的命名规则,直接对接第三方DLL:

  1. 引入JNA依赖(Maven示例):
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.13.0</version>
</dependency>
  1. 定义接口映射DLL函数:
import com.sun.jna.Library;
import com.sun.jna.Native;

public interface PRx08Library extends Library {
    PRx08Library INSTANCE = Native.load("PRx08", PRx08Library.class);
    // 函数签名需与DLL完全一致,若为stdcall调用约定,继承StdCallLibrary
    short Enumerate();
}
  1. 调用代码:
short result = PRx08Library.INSTANCE.Enumerate();

方案二:编写JNI适配层DLL

通过自制桥接DLL,将Java native方法与第三方DLL函数关联:

  1. 生成JNI头文件:
    执行命令javac -h . com/example/javaprx08/model/PRx08.java,生成com_example_javaprx08_model_PRx08.h。
  2. 编写C/C++桥接代码:
#include "com_example_javaprx08_model_PRx08.h"
#include <windows.h>

typedef short (*EnumerateFunc)();

JNIEXPORT jshort JNICALL Java_com_example_javaprx08_model_PRx08_Enumerate
(JNIEnv *env, jobject obj) {
    HINSTANCE hDll = LoadLibrary("PRx08.dll");
    if (!hDll) return -1;
    
    EnumerateFunc func = (EnumerateFunc)GetProcAddress(hDll, "Enumerate");
    if (!func) {
        FreeLibrary(hDll);
        return -2;
    }
    
    short result = func();
    FreeLibrary(hDll);
    return result;
}
  1. 编译上述代码生成适配DLL(如PRx08Adapter.dll),修改Java类加载该适配DLL:
package com.example.javaprx08.model;

public class PRx08 {
    static {
        try {
            System.load("适配DLL的路径\\PRx08Adapter.dll");
        } catch (UnsatisfiedLinkError e) {
            System.out.println(e);
        }
    }

    public native short Enumerate();
}
  1. 正常调用即可。

关键注意点

  • 确保DLL位数(32/64位)与JVM位数完全一致,否则加载失败。
  • 检查第三方DLL的依赖库,确保所有依赖项在系统路径或程序运行目录中。
  • 若DLL函数名有修饰(如_Enumerate@0这类因调用约定产生的改编名),映射时需使用实际导出的函数名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:03:30