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;

有任何想法吗?

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 -lcryptopp

With 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 -lcryptopp

The 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 #endif

And 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){ //------------ }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;

有任何想法吗?

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 -lcryptopp

With 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 -lcryptopp

The 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 #endif

And 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){ //------------ }