在 JNI 调用时出现不满意的链接错误
UnsatisfiedLinkError at JNI invocation
我已经发现了很多关于 UnsatisfiedLinkError 与 JNI 结合使用的东西和问题,但没有一个能帮助我。我正在尝试使用 Java 隐藏一个窗口,所以我需要 3 个 WinAPI 函数。
我有以下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()));
}
}
然后我有我的hide_window_HideWindow.h由javah生成。有一件事我必须改变,因为它在库路径中找不到 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;
}
来自 eclipse 的调用和通过 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
希望这个问题不要太傻,提前谢谢你,汤姆
看一下原型:
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)
要从数组中取出字符,请查看GetPrimitiveArrayCritial
或GetCharArrayRegion
.
生成的标头对我来说也很可疑,因为您将 Java 方法定义为static
但生成的原型想要传递jobject
......静态方法需要jclass
(因为静态方法调用没有实例对象):
JNIEXPORT jint JNICALL Java_hide_window_HideWindow_hideWindow
(JNIEnv* env, jclass clazz, jcharArray windowTitle)
另一件事:Java的char
(jchar
)是一个unsigned int16
,C/C++ char
是有符号或无符号int8
。因此,最好传递一个String
(jstring
)并使用GetStringUTFChars
将内容作为UTF8字符串获取。
- 编译器找不到链接的 OpenCV 库
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- Eclipse/MinGW 不会链接库
- 与好友运算符接口<<:为什么不能链接?
- 为什么需要双指针来更改头部,而不是链接列表中的其他地方
- 关于在 ndk r15 中的类中初始化的静态成员的不满意链接错误
- 交叉围栏GCC:在检查动态链接器特征时,在GCC_NO_EXECUTABLES之后不允许链接测试
- 发生 JNI 调用 c++ dll "不满意链接错误: 对内存位置的无效访问"
- 非实例化模板成员的编译时错误,而不是链接时错误
- log4cxx构建并编译,但运行时会出现不满足链接异常
- JNA 和 C++ - 导致不满意链接错误的简约示例
- 使用Windows函数SendMessage会导致与MSVC发生链接错误,但与MinGW不发生链接错误
- 在运行时找不到链接库 (c++)
- 可以在不设置链接器>常规>附加库目录的情况下搜索哪种 dll 或 lib
- JNI HellowWorld 不满意链接错误 找不到依赖库
- 为什么头部不改变 - 链接列表实现
- ExceptionInInitializerError Android NDK由以下原因引起:不满足链接错误:findL
- Java中的不满足链接错误,来自JNI
- 如何将.cpp文件编译为对象文件而不调用链接器
- 不能链接dbus和c++