我正在使用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;有任何想法吗?
I'm using JNI successfully to call some C code, however when I want to change to C++ JNI throws an UnsatisfiedLinkError whenever I try to call a method.
This one works:
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 -lcryptoppWith this one, I get an 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 -lcryptoppThe generated header is as follows:
/* 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 #endifAnd my implementation (.cpp) is as follows, I omitted the decrypt method:
#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))); }For the C version I simply write return (*env)->NewStringUTF(env, encrypt((*env)->GetStringUTFChars(env, s, JNI_FALSE))); instead.
The C version works, the C++ version fails with:
Exception in thread "main" java.lang.UnsatisfiedLinkError: de.zdv.research.emdu.CI3CppEncryptionTools.encrypt(Ljava/lang/String;)Ljava/lang/String;Any ideas?
最满意答案
在实现(.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){ //------------ }In implementation (.cpp) you have written function as
jstring Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt(JNIEnv *env, jobject obj, jstring s){ //--------- }Please write it as
JNIEXPORT jstring JNICALL Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt (JNIEnv *, jclass, jstring){ //------------ }更多推荐
发布评论