0

我正在使用jni4netJava 中的 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?

4

1 回答 1

0

对于该jni4net版本,它正确找到了 dll,但格式错误。您可能正在使用带有 64 位 DLL 的 32 位 JVM,反之亦然。您可以尝试在命令行中添加/32BIT+ /force开关。proxygen

DLL 可能存在其他问题,因为错误消息提到了它的依赖关系。您的评论表明与 Visual C++ 运行时包相关的错误消息。


对于 JNA 库加载,由于反斜杠转义不当,您找不到 DLL。

在 Java(和许多其他语言)中,反斜杠 ( \) 是转义字符。在字符串中使用时,它具有特殊含义,例如 ( \n) 表示换行符。

在代表路径的 String 中,您没有转义反斜杠,因此 String"C:\Users\320035705\Downloads\JNAHelloWorldMWrobel\JNAHelloWorldMWrobel\sampledlls"最终被解释为"C:Users320035705DownloadsJNAHelloWorldMWrobelJNAHelloWorldMWrobelsampledlls".

使用两个反斜杠 ( \\) 来表示 Java 字符串中的单个反斜杠。如果您像这样指定路径,它应该适用于 JNA:

System.setProperty("jna.library.path",
    "C:\\Users\\320035705\\Downloads\\JNAHelloWorldMWrobel\\JNAHelloWorldMWrobel\\sampledlls");

但是,如果存在 DLL 需要另一个依赖项的问题,这可能会因同样的原因而失败。

于 2020-08-21T04:17:44.317 回答