我已经发现很多关于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