2015-10-04 102 views
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?

回答

1

我試圖重現您的問題,但我得到不同的標題。如果重新創建MessageBox.javasrc目錄並javac -d build src/MessageBox.java編譯並最終獲得C/C++頭與javah -d include -classpath build src.MessageBox

然後,我得到了這個方法的簽名

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++頭文件?也許這是問題所在。

+0

我只是根據https://developer.android.com/ndk/samples/sample_hellojni.html中的命名「規則」手動創建它。然而,我確實通過不使用私有代理函數來工作(出於某種原因,它生成了相同的頭,這不起作用),然後使用javah生成頭。我現在只想諮詢javah。謝謝! – Therhang

相關問題