Java JNI UnsatisfiedLinkError

时间:2015-10-04 07:51:18

标签: java c++ java-native-interface unsatisfiedlinkerror

我正在尝试使用JNI向Java公开C ++功能。我试图让一个简单的消息框首先出现,只是为了确保一切正常。但是,我得到一个抛出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?

1 个答案:

答案 0 :(得分:1)

我试图重现你的问题,但我得到了不同的标题。如果在MessageBox.java目录中重新创建src并使用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 ++标头的?也许这就是问题。