java可以调用没有通过jni编译的dll动态库吗

结果:
可以使用jna的std方式加载

public interface StdCallDll extends StdCallLibrary {
    String dll_path = "HxgcDeviceApi_J10";
    StdCallDll INSTANCE = (StdCallDll) Native.load(dll_path, StdCallDll.class);
    int CarderClose();//对应的dll动态库的方法
    int GetModuleVer(int piIModule, String poPszModuleVer);
}

网上看很多教程都是调用的经过jni编译后的,我现在情况是这个动态库第三方提供的,没有经过jni编译的,有没有方法可以用java来调用,具体要怎么操作,还有就是dll函数里面int是返回值,CarderClose是函数名,那这个__stdcall是什么啊
我现在用

dll函数:
int __stdcall CarderClose();

java实现:
static {
        System.loadLibrary("lib/DeviceApi_J10");
    }

    public native int CarderClose();

    public static void main(String[] args) {
        new App().CarderClose();
    }
    
    Exception in thread "main" java.lang.UnsatisfiedLinkError: com.test.App.CarderClose()I
    at com.keyou.App.CarderClose(Native Method)
    at com.keyou.App.main(App.java:12)
 `
阅读 4.1k
3 个回答

自己用c++写一个调用第三方动态库的代理dll,然后把代理dll的引出函数写成符合jni规范的函数,然后把代理dll和第三方dll放到jni指定的路径即可,java调用代理dll,然后代理dll再调用第三方动态库。

可以 看起来是CarderClose注册的包名不对 确定第三方用的是com.test.App ? 可以用 dumpbin -exports DeviceApi_J10.dll | findstr CarderClose 查看一下

JNI实践中,native模块需要使用java相关的头文件编写,而且需要依照代码模板编写,不是直接调用dll就可以的。解决方法如1楼所说,需要自己包装一层JNI方法,然后再调用dll

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题