如何解决使用jni4net在Java中使用本机DLL函数并获取System.BadImageFormatException
我正在使用jni4net
来使用Java中的DLL函数。
使用jni4net-0.8.6.0-bin,我使用以下命令进行编译:
.\proxygen.exe "D:\sampledlls\sample_interface.dll" -wd "D:\hope"
执行此命令时,出现以下错误:
System.BadImageFormatException: Could not load file or assembly 'file:///D:\sampledlls\sampledll.dll' or one of its dependencies. The module was expected to contain an assembly manifest.
我还使用JNA库在Java中使用DLL函数。但是在这种情况下,我也收到以下错误:
java.lang.UnsatisfiedLinkError: Unable to load library 'sampledll': The specified module could not be found.
这是我的JNA代码:
public class hellodll {
public interface dcmInterfaceDLL extends Library {
public void DCM_InitializeFields();
}
public static void main(String[] args) {
System.out.println(System.getProperty("java.library.path"));
System.setProperty("jna.library.path","C:\Users\320035705\Downloads\JNAHelloWorldMWrobel\JNAHelloWorldMWrobel\sampledlls");
dcmInterfaceDLL sdll = (dcmInterfaceDLL)
Native.loadLibrary("sample_interface",dcmInterfaceDLL.class);
System.loadLibrary("sample_interface");
sdll.DCM_InitializeFields();
}
}
这是一个native.dll。
如何加载DLL?
解决方法
对于jni4net
版本,它可以正确找到dll,但格式错误。您可能正在使用带有64位DLL的32位JVM,反之亦然。您可以尝试将/32BIT+ /force
开关添加到proxygen
命令行。
DLL可能还有其他问题,因为错误消息中提到了它的依赖性。您的注释指示与Visual C ++运行时程序包相关的错误消息。
对于JNA库加载,由于反斜杠转义不正确,因此找不到DLL。
在Java(和许多其他语言)中,反斜杠(\
)是转义字符。当在String中使用时,它具有特殊含义,例如({\n
)代表换行符。
在表示路径的字符串中,您没有转义反斜杠,因此字符串"C:\Users\320035705\Downloads\JNAHelloWorldMWrobel\JNAHelloWorldMWrobel\sampledlls"
最终被解释为"C:Users320035705DownloadsJNAHelloWorldMWrobelJNAHelloWorldMWrobelsampledlls"
。
使用两个反斜杠(\\
)表示Java字符串中的单个反斜杠。如果您这样指定路径,则该路径应适用于JNA:
System.setProperty("jna.library.path","C:\\Users\\320035705\\Downloads\\JNAHelloWorldMWrobel\\JNAHelloWorldMWrobel\\sampledlls");
但是,如果DLL需要另一个依赖关系,则可能由于相同的原因而失败。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。