簡體   English   中英

JNI和C ++ - UnsatisfiedLinkError

[英]JNI and C++ - UnsatisfiedLinkError

我正在使用JNI成功調用一些C代碼,但是當我想要更改為C ++時,每當我嘗試調用一個方法時,JNI都會拋出一個UnsatisfiedLinkError

這個工作:

g++ -c -Icryptopp562 -O3 -fPIC -fpermissive CI3CppEncryptionToolsImpl.cpp
gcc -I${JAVA_HOME}/include -O3 -shared -fPIC -o libCI3CppEncryptionTools.so de_zdv_research_emdu_CI3CppEncryptionTools.c CI3CppEncryptionToolsImpl.o -lcryptopp

有了這個,我得到一個UnsatisfiedLinkError

g++ -c -Icryptopp562 -O3 -fPIC -fpermissive CI3CppEncryptionToolsImpl.cpp
g++ -I${JAVA_HOME}/include -O3 -shared -fPIC -fpermissive -o libCI3CppEncryptionTools.so de_zdv_research_emdu_CI3CppEncryptionTools.cpp CI3CppEncryptionToolsImpl.o -lcryptopp

生成的標頭如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class de_zdv_research_emdu_CI3CppEncryptionTools */

#ifndef _Included_de_zdv_research_emdu_CI3CppEncryptionTools
#define _Included_de_zdv_research_emdu_CI3CppEncryptionTools
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     de_zdv_research_emdu_CI3CppEncryptionTools
 * Method:    encrypt
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt
  (JNIEnv *, jclass, jstring);

/*
 * Class:     de_zdv_research_emdu_CI3CppEncryptionTools
 * Method:    decrypt
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_de_zdv_research_emdu_CI3CppEncryptionTools_decrypt
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

而我的實現(.cpp)如下,我省略了decrypt方法:

#include <jni.h>

#include "CI3CppEncryptionToolsImpl.h"

#include "de_zdv_research_emdu_CI3CppEncryptionTools.h"

jstring
Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt(JNIEnv *env, jobject obj, jstring s) {

    return env->NewStringUTF(encrypt(env->GetStringUTFChars(s, JNI_FALSE)));

}

對於C版本,我只需編寫return (*env)->NewStringUTF(env, encrypt((*env)->GetStringUTFChars(env, s, JNI_FALSE))); 代替。

C版本有效,C ++版本失敗:

Exception in thread "main" java.lang.UnsatisfiedLinkError: de.zdv.research.emdu.CI3CppEncryptionTools.encrypt(Ljava/lang/String;)Ljava/lang/String;

有任何想法嗎?

在實現(.cpp)中,您已將函數編寫為

jstring Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt(JNIEnv *env, jobject obj, jstring s){
       //---------
}

請把它寫成

JNIEXPORT jstring JNICALL Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt
(JNIEnv *, jclass, jstring){
       //------------
}

確保java可以在啟動JVM的同一目錄中找到動態本機庫。 還要檢查您的動態庫是否與您運行程序的JVM編譯的架構相同(例如,對於32位JMV為32位,對於64位JVM為64位)

如果編譯C ++,則在函數聲明/定義之前應該有一個extern "C"前綴。

但是還有其他差異,請參閱C與C ++中的JNI Calls不同?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM