我已經發現很多關於UnsatisfiedLinkError和JNI的問題,但是他們都沒有幫助我。 我想隱藏一個使用Java的窗口,所以我需要3個WinAPI函數。在JNI調用時出現UnsatisfiedLinkError
我有以下的Java源:
package hide.window;
public class HideWindow {
public native static int hideWindow(char[] windowTitle);
static {
System.loadLibrary("hideWindow");
}
public static void main(String[] args) {
System.out.println("loadLibrary was successful");
System.out.println(hideWindow("Session Window - Windows Internet Explorer".toCharArray()));
}
}
然後我有JAVAH產生我hide_window_HideWindow.h。 有一兩件事我必須改變,因爲它沒有在庫中找到路徑的jni.h文件,所以我只是把它放到我的項目,它包括以下方式:
#include "jni.h"
五月這項事業我的錯誤? 整個文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class hide_window_HideWindow */
#ifndef _Included_hide_window_HideWindow
#define _Included_hide_window_HideWindow
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: hide_window_HideWindow
* Method: hideWindow
* Signature: ([C)I
*/
JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow
(JNIEnv *, jobject, jcharArray);
#ifdef __cplusplus
}
#endif
#endif
我編我的DLL的代碼如下:
#include <windows.h>
#include "hide_window_HideWindow.h"
using namespace std;
JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow(char windowTitle[20])
{
HWND windowHandle = FindWindowA(NULL, windowTitle);
if (windowHandle){
if (IsWindowVisible(windowHandle)){
ShowWindow(windowHandle, 0);
return 0;
}
else{
ShowWindow(windowHandle, 1);
return 1;
}
}
return -1;
}
有從日食的呼叫,並通過CMD以下調用之間沒有差異(路徑是正確的) :
java -Djava.library.path=.. hide.window.HideWindow
輸出結果看起來像這樣:
loadLibrary was successful Exception in thread "main" java.lang.UnsatisfiedLinkError: hide.window.HideWindow.hideWindow([C)I at hide.window.HideWindow.hideWindow(Native Method) at hide.window.HideWindow.main(HideWindow.java:12)
這表明,我認爲Java程序能夠加載DLL,但它在函數調用失敗。 我使用Eclipse作爲Java和Codeblocks作爲C++ IDE,並且我已經將以下內容添加到mingw構建選項中。
-Wl,--kill-at
我希望這個問題不是太傻了,謝謝你在前進, 湯姆
你介意在這裏採取看看這個:http://stackoverflow.com/questions/18693949/jni-java-lang-unsatisfiedlinkerror-same-dll-but-different-location ^^ – displayname 2013-09-09 08:35:38