2012-04-27 75 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

相关问题