这是我的问题:我试图在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);
#ifdef __cplusplus }
#endif
#endif
这是PrinterWinAPI.c文件本身:
#include "PrinterWinAPI.h" // Generated
#include <windows.h>
#include <wincon.h>
#include <winspool.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <io.h>
// Implementation of the native method
JNIEXPORT jlong JNICALL Java_PrinterWinAPI_GetStatus(JNIEnv *env,
jobject thisObj, jstring str) {
//some stuff...
return (int64_t)dwStatus;
}
再一次,该程序可以在命令提示符下使用javac,javah和java进行编译并正常运行,我99%的确定问题是由于eclipse引起的,但我真的不知道从哪里开始。 我花了几个小时在网上寻找解决方案,但找不到任何东西。为什么Eclipse无法运行我的项目,但是手动运行Java二进制文件却可以?
我的jre / jdk是1.8.0_101-b13 64位版本
Eclipse:Oxygen.3a发行版(4.7.3a)
操作系统:Windows 7 64位
答案 0 :(得分:0)
@ user2543253谢谢你的工作!之所以正确编译,是因为我的java文件不在软件包中,所以标头是正确的,但是由于java文件嵌套在我项目的软件包中,所以正确的标头是BubbleShowCaseBuilder(this) //Activity instance
.title("foo") //Any title for the bubble view
.targetView(view) //View to point out
.show() //Display the ShowCase
而不是Java_com_printer_PrinterWinAPI_GetStatus
。 / p>