2012-04-27 74 views
2

我已經發現很多關於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 

我希望這個問題不是太傻了,謝謝你在前進, 湯姆

回答

5

看看原型:

JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow 
    (JNIEnv *, jobject, jcharArray); 

和您的實現:

JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow 
    (char windowTitle[20]) 

當然有UnsatisfiedLinkError因爲你沒有實現正確的功能。

所以,你會需要這樣的東西:

JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow 
    (JNIEnv* env, jobject thiz, jcharArray windowTitle) 

而且得到了字符數組看看GetPrimitiveArrayCritialGetCharArrayRegion

生成的標題也對我來說看起來很可疑,因爲您將Java方法定義爲static,但生成的原型想要通過jobject ...靜態方法需要jclass(因爲靜態方法調用沒有實例對象):

JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow 
    (JNIEnv* env, jclass clazz, jcharArray windowTitle) 

另一件事:Java的charjchar)是unsigned int16,C/C++ char帶符號int8。因此,最好通過Stringjstring)並使用GetStringUTFChars以UTF8字符串的形式獲取內容。

+0

你介意在這裏採取看看這個:http://stackoverflow.com/questions/18693949/jni-java-lang-unsatisfiedlinkerror-same-dll-but-different-location ^^ – displayname 2013-09-09 08:35:38

相關問題