JNI和C ++

编程入门 行业动态 更新时间:2024-10-24 10:14:39
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){ //------------ }

更多推荐

本文发布于:2023-08-07 23:04:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1466413.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:JNI

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!