使用jni4net在java中使用本机dll函数并获取system.badimageformatexception

hof1towb  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(433)

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

0yycz8jy

0yycz8jy1#

对于 jni4net 版本,它正确地找到了dll,但格式不正确。您可能正在使用32位jvm和64位dll,反之亦然。你可以尝试添加 /32BIT+ /force 切换到 proxygen 命令行。
当错误消息提到其依赖项时,dll可能还有其他问题。您的注解指示与visual c++运行时包相关的错误消息。
对于jna库加载,由于反斜杠转义不当,无法找到dll。
在java(和许多其他语言)中,反斜杠( \ )是转义字符。在字符串中使用时,它有特殊的含义,例如( \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需要另一个依赖项的问题,则可能会由于相同的原因而失败。

相关问题