java - JNI 和 C++ - UnsatisfiedLinkError

标签 java c++ java-native-interface

我成功地使用 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

生成的header如下:

/* 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 - JNI 和 C++ - UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21133702/

相关文章:

java - 配置文件位于 JAR 内。如何将配置文件放在JAR之外?

java - 如何为 Android 和 iOS 使用相同的 C++ 代码?

Java 函数从 C++ 代码 Eclipse jni 获取结果

java - Olingo 2.0.6 JPA 扩展 : EdmComplexTypeImplProv cannot be cast to EdmSimpleType

java - 无法读取上传的多部分 xml 文件

java - 在 TreeSet 中搜索特定元素

c++ - 传递右值与左值 vector

c++ - 目标及其 SO 依赖项的 CMake `INSTALL`

c++ - 如何使用概念来约束可变参数函数的参数类型?

java - C 指针 - 从 Char 到 Char 的无效转换*