Java JNI UnsatisfiedLinkError
Java JNI UnsatisfiedLinkError
我正在尝试使用 JNI 向 Java 公开 C++ 功能。我试图首先显示一个简单的消息框,只是为了确保一切正常。但是,我得到了一个 UnsatisfiedLinkError 异常被抛出(当我调用函数时抛出异常,而不是)
Java class(项目 cpplib):
package src;
public class MessageBox {
static {
System.loadLibrary("cpplib");
}
private static native void libf_show(String message, String caption);
public static void show(String message, String caption) {
libf_show(message, caption);
}
}
注意:cpplib
的文件夹,DLL,已经添加到原生库路径
C++ header messagebox.hpp
:
#pragma once
#include "jni.h"
extern "C"
{
JNIEXPORT void JNICALL Java_cpplib_src_MessageBox_show(JNIEnv *env, jstring jstr_message, jstring jstr_caption);
}
C++ 源码messagebox.cpp
:
#include "messagebox.hpp"
#include <windows.h>
JNIEXPORT void JNICALL Java_cpplib_src_MessageBox_show(JNIEnv *env, jstring jstr_message, jstring jstr_caption)
{
const char *message = env->GetStringUTFChars(jstr_message, 0);
const char *caption = env->GetStringUTFChars(jstr_caption, 0);
MessageBox(NULL, message, caption, MB_OK);
env->ReleaseStringUTFChars(jstr_message, message);
env->ReleaseStringUTFChars(jstr_caption, caption);
}
完整错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: src.MessageBox.libf_show(Ljava/lang/String;Ljava/lang/String;)V
at src.MessageBox.libf_show(Native Method)
at src.MessageBox.show(MessageBox.java:11)
at src.CPPLIB_Test.main(CPPLIB_Test.java:6)
我相信我使用的是 JDK 的 64 位版本(因为 32 位 DLL 不工作),所以我使用适当的 64 位 JDK headers(如果它们完全不同的话)。
为什么 Java 不喜欢我的 DLL?
我试图重现你的问题,但我得到了不同的 header。如果在 src
目录中重新创建 MessageBox.java
并使用 javac -d build src/MessageBox.java
进行编译,最后使用 javah -d include -classpath build src.MessageBox
[=16 获得 C/C++ headers =]
然后,我得到了这个方法签名
JNIEXPORT void JNICALL Java_src_MessageBox_libf_1show (JNIEnv *, jclass, jstring, jstring);
改为
JNIEXPORT void JNICALL Java_cpplib_src_MessageBox_show(JNIEnv *env, jstring jstr_message, jstring jstr_caption);
您如何创建 C++ header?也许是这里的问题。
我正在尝试使用 JNI 向 Java 公开 C++ 功能。我试图首先显示一个简单的消息框,只是为了确保一切正常。但是,我得到了一个 UnsatisfiedLinkError 异常被抛出(当我调用函数时抛出异常,而不是)
Java class(项目 cpplib):
package src;
public class MessageBox {
static {
System.loadLibrary("cpplib");
}
private static native void libf_show(String message, String caption);
public static void show(String message, String caption) {
libf_show(message, caption);
}
}
注意:cpplib
的文件夹,DLL,已经添加到原生库路径
C++ header messagebox.hpp
:
#pragma once
#include "jni.h"
extern "C"
{
JNIEXPORT void JNICALL Java_cpplib_src_MessageBox_show(JNIEnv *env, jstring jstr_message, jstring jstr_caption);
}
C++ 源码messagebox.cpp
:
#include "messagebox.hpp"
#include <windows.h>
JNIEXPORT void JNICALL Java_cpplib_src_MessageBox_show(JNIEnv *env, jstring jstr_message, jstring jstr_caption)
{
const char *message = env->GetStringUTFChars(jstr_message, 0);
const char *caption = env->GetStringUTFChars(jstr_caption, 0);
MessageBox(NULL, message, caption, MB_OK);
env->ReleaseStringUTFChars(jstr_message, message);
env->ReleaseStringUTFChars(jstr_caption, caption);
}
完整错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: src.MessageBox.libf_show(Ljava/lang/String;Ljava/lang/String;)V
at src.MessageBox.libf_show(Native Method)
at src.MessageBox.show(MessageBox.java:11)
at src.CPPLIB_Test.main(CPPLIB_Test.java:6)
我相信我使用的是 JDK 的 64 位版本(因为 32 位 DLL 不工作),所以我使用适当的 64 位 JDK headers(如果它们完全不同的话)。
为什么 Java 不喜欢我的 DLL?
我试图重现你的问题,但我得到了不同的 header。如果在 src
目录中重新创建 MessageBox.java
并使用 javac -d build src/MessageBox.java
进行编译,最后使用 javah -d include -classpath build src.MessageBox
[=16 获得 C/C++ headers =]
然后,我得到了这个方法签名
JNIEXPORT void JNICALL Java_src_MessageBox_libf_1show (JNIEnv *, jclass, jstring, jstring);
改为
JNIEXPORT void JNICALL Java_cpplib_src_MessageBox_show(JNIEnv *env, jstring jstr_message, jstring jstr_caption);
您如何创建 C++ header?也许是这里的问题。