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