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)
`
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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