Java JNI UnsatisfiedLinkError

Java JNI UnsatisfiedLinkError

本文关键字:UnsatisfiedLinkError JNI Java      更新时间:2023-10-16

我正在尝试使用JNI将c++功能暴露给Java。我想先显示一个简单的消息框,以确保一切正常。然而,我得到一个UnsatisfiedLinkError异常被抛出(异常被抛出时,我调用函数,而不是)

Java类(项目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++标头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)

我相信我正在使用64位版本的JDK(因为32位DLL不起作用),所以我使用适当的64位JDK头文件(如果它们完全不同)。

为什么Java不喜欢我的DLL?

我试图重现您的问题,但我得到不同的标题。如果您在src目录中重新创建MessageBox.java,并使用javac -d build src/MessageBox.java进行编译,最后使用javah -d include -classpath build src.MessageBox

获得C/c++头文件

然后,我得到这个方法签名

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++头文件?也许这就是问题所在。