Java JNI和C++;-不满意链接错误 我成功地使用JNI调用一些C代码,但是当我想改变C++时,每当我尝试调用一个方法时,就会抛出 >不满意的链接错误>代码>

Java JNI和C++;-不满意链接错误 我成功地使用JNI调用一些C代码,但是当我想改变C++时,每当我尝试调用一个方法时,就会抛出 >不满意的链接错误>代码>,java,c++,java-native-interface,Java,C++,Java Native Interface,这一个有效: 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 有了这个,我得到

这一个有效:

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
有了这个,我得到了一个
不满意的链接错误

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
对于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;

有什么想法吗?

确保java可以在启动JVM的同一目录中找到您的动态本机库。还要检查您的动态库是否编译为与运行程序的JVM相同的体系结构(例如,32位JMV为32位,64位JVM为64位)

在实现(.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){
       //------------
}

如果编译C++,则在函数声明/定义之前应该有一个<代码>外部“C”< /C>前缀。


但是还有其他区别,请参见

我通过
Java-Djava.library.path=lib…
调用我的Java应用程序以确保找到库。架构匹配,正如我提到的,C版本运行没有任何问题。我已经尝试过了,但遗憾的是它没有工作,因为我知道
JNIEXPORT
JNICALL
是确保正确C绑定的宏。。。但是我也看到过一些例子,它们被忽略了,并且成功了。@yvesonline JNIEXPORT不是问题所在,问题在于您的实现参数与您的定义不同。第二个参数应该是jclass,而不是jobject,以匹配静态函数的JNI定义。啊!对不起,我没看到!这正是问题所在。谢谢我想知道为什么C版本是这样工作的……我不明白为什么坏的参数类型会导致
不满意的linkerror
。我遗漏了什么?@manuell请检查传递给函数的参数类型
JNIEXPORT jstring JNICALL Java_de_zdv_research_emdu_CI3CppEncryptionTools_encrypt
(JNIEnv *, jclass, jstring){
       //------------
}