gpt4 book ai didi

java - Eclipse Java JNI,java.lang.UnsatisfiedLinkError加载dll

转载 作者:行者123 更新时间:2023-12-02 05:49:45 27 4
gpt4 key购买 nike

我在加载打印机 dll 时遇到问题。我有一个来自打印机制造商的 dll 文件 (JniPrinterStatusLib.dll)。我按照打印机制造商的建议编写了代码。代码是:

package com.printer.test

public class JniPrinterStatus {
static{
System.loadLibrary("JniPrinterStatusLib");
}

public native int GetStatus(String printer);
}
package com.printer.test

public class TestSample {
public static void main(String[] args) {
int status;
String printer = "MY PRINTER";
JniPrinterStatus jps = new JniPrinterStatus();

System.out.println("PRINTER NAME = " + printer);

status = jps.GetStatus(printer);
if (status == -1) {
System.out.println("status = -1");
}
else if (status == 0) {
System.out.println("status = NORMAL");
}
else if ((status & 0x00000080) != 0) {
System.out.println("status = PRINTER_STATUS_OFFLINE");
}
else if ((status & 0x00400000) != 0) {
System.out.println("status = PRINTER_STATUS_DOOR_OPEN");
}
else if ((status & 0x00000010) != 0) {
System.out.println("status = PRINTER_STATUS_PAPER_OUT");
}
else if ((status & 0x00000800) != 0) {
System.out.println("status = PRINTER_STATUS_OUTPUT_BIN_FULL");
}
else if ((status & 0x00000040) != 0) {
System.out.println("status = PRINTER_STATUS_PAPER_PROBLEM");
}
}
}

我使用Eclipse运行代码,我将dll库放在文件夹project中,错误是

PRINTER NAME = MY PRINTER
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.printer.test.JniPrinterStatus.GetStatus(Ljava/lang/String;)I
at com.printer.test.JniPrinterStatus.GetStatus(Native Method)
at com.printer.test.TestSample.main(TestSample.java:10)

如果我将源代码从包“com.printer.test”移至默认包,则代码可以工作并显示:

PRINTER NAME = MY PRINTER
status = -1

我不知道这怎么可能。如果我在没有包的情况下从命令提示符编译并运行代码,它就可以工作。

问题出在哪里?

谢谢

最佳答案

来自类UnsatisfiedLinkErrorjavadoc...

Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native.

这意味着找不到函数Java_com_printer_test_JniPrinterStatus_GetStatus

java.lang.System 类中的方法 loadLibrary 通常搜索 [System] 属性“java.library.path”中列出的目录。对于Windows机器,该属性的值一般是PATH环境变量的值。

因此,我建议在代码中打印出该属性的值,以查看它是否包含包含 DLL 的目录。如果没有,那么您需要通过重新定位 DLL 或更改 PATH 环境变量或使用 -Djava.library.path=... 选项启动 java 程序来修复该问题。之后,您需要检查 native 方法的签名。 Dependency Walker是我在工作中用来完成此任务的工具。

编辑重新阅读您的问题后,我觉得我没有准确回答您的问题,所以让我补充一下......

Eclipse 的默认行为是将资源文件(如 DLL)复制到输出文件夹。因此,如果您将 DLL 放入文件夹 src\com\printer\test 中,它将复制到文件夹 bin\com\printer\test 中。我的猜测是,当前的工作目录,即 . 位于您的“java.library.path”中,这就是当您的 java 代码位于默认包中时它可以工作的原因。

关于java - Eclipse Java JNI,java.lang.UnsatisfiedLinkError加载dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56060097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com