问题描述
使用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需要另一个依赖关系,则可能由于相同的原因而失败。