这是我的问题:我试图在我的 Java 项目中使用 JNI 作为与 Win32 API 对话的一种方式。我在 Eclipse 运行时收到此错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.printer.PrinterWinAPI.GetStatus(Ljava/lang/String;)J
at com.printer.PrinterWinAPI.GetStatus(Native Method)
at com.printer.PrinterWinAPI.<init>(PrinterWinAPI.java:14)
at com.printer.PrinterWinAPI.main(PrinterWinAPI.java:25)
但是我的问题真正奇怪的是我可以使用 cmd 成功编译我的项目:
javac PrinterWinAPI.java
然后程序运行良好:
java PrinterWinAPI
据我了解,eclipse 成功找到了我的 .dll 文件,但在文件中找不到 GetStatus() 函数。我尝试使用 x86 和 x86_64 中的 Visual Studio 以及 x86 和 x86_64 中的 mingw gcc 来编译它。这是我的文件:
实现JNI接口的java文件:PrinterWinAPI.java
package com.printer;
public class PrinterWinAPI {
static {
System.load("C:\\GetPrinterStatus.dll");
}
public Long status;
public String name;
public PrinterWinAPI(String printerName) {
this.name = printerName;
this.status = this.GetStatus(this.name);
}
private native long GetStatus(String str);
public static void main(String[] args) {
PrinterWinAPI printer = new PrinterWinAPI("PRINTER NAME EXAMPLE");
System.out.println(printer.status);
}
}
PrinterWinAPI.h,使用 javah PrinterWinAPI 生成:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> /* Header for class PrinterWinAPI */
#ifndef _Included_PrinterWinAPI
#define _Included_PrinterWinAPI
#ifdef __cplusplus extern "C" {
#endif /* * Class: PrinterWinAPI * Method:
GetStatus * Signature: (Ljava/lang/String;)J */
JNIEXPORT jlong JNICALL Java_PrinterWinAPI_GetStatus (JNIEnv *, jobject, jstring);
再一次,程序在命令提示符下使用 javac、javah 和 java 编译和运行良好,我 99% 确定问题来自 eclipse,但我真的不知道从哪里开始。我花了几个小时在网上寻找解决方案,但找不到任何东西。为什么eclipse不能运行我的项目,但是手动运行的java二进制文件可以?
呼如林
相关分类