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

发布于 2022-09-11 23:53:41 字数 927 浏览 36 评论 0

结果:
可以使用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)
 `

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

空心空情空意 2022-09-18 23:53:41

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

无远思近则忧 2022-09-18 23:53:41

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

念﹏祤嫣 2022-09-18 23:53:41

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文