1
我想使用JNI向Java公開C++功能。我試圖讓一個簡單的消息框首先出現,只是爲了確保一切正常。然而,我發現了一個UnsatisfiedLinkError異常被拋出(當我打電話的功能異常被拋出,而不是)Java JNI 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)
相信我使用的JDK的64位版本(作爲32位DLL沒有工作),所以我使用適當的64位JDK標頭(如果它們完全不同)。
爲什麼Java不像我的DLL?
我只是根據https://developer.android.com/ndk/samples/sample_hellojni.html中的命名「規則」手動創建它。然而,我確實通過不使用私有代理函數來工作(出於某種原因,它生成了相同的頭,這不起作用),然後使用javah生成頭。我現在只想諮詢javah。謝謝! – Therhang