问题描述
错误:Exceptioninthread"main"java.lang.UnsatisfiedLinkError:ctest.test.decrypt([BLjava/lang/String;)[Batctest.test.decrypt(NativeMethod)atctest.test.main(test.java:34)我在做jni的demo的时候出现以上错误java代码:packagectest;importjava.io.File;/***<p>Title:</p>**<p>Description:</p>**<p>Copyright:Copyright(c)2013</p>**<p>Company:</p>**@authornotattributable*@version1.0*/publicclasstest{publictest(){}static{//System.loadLibrary("encrypt");System.load("D:"+File.separator+"java开发"+File.separator+"wordspace"+File.separator+"ccWorkTools"+File.separator+"classes"+File.separator+"test.dll");}publicstaticvoidmain(Stringargs[]){decrypt(newbyte[10],"string");}publicstaticnativebyte[]decrypt(byte[]encryptData,Stringpassword);}c++代码#include<windows.h>#include"test.h"#include"jni.h"#include<string>JNIEXPORTjbyteArrayJNICALLJava_ctest_test_decrypt(JNIEnv*env,jclasss,jbyteArraybyteArr,jstringstr){bytepData[]={0x01,0x01,0x02,0xe4,0x71,0x2b,0x5f,0x30};jbyte*by=(jbyte*)pData;intnOutSize=sizeof(pData);jbyteArrayjarray=env->NewByteArray(nOutSize);env->SetByteArrayRegion(jarray,0,nOutSize,by);constchar*nativeString=env->GetStringUTFChars(str,0);printf("%s",nativeString);returnjarray;}BOOLWINAPIDllMain(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved){switch(fdwReason){caseDLL_PROCESS_ATTACH://attachtoprocess//returnFALSEtofailDLLloadbreak;caseDLL_PROCESS_DETACH://detachfromprocessbreak;caseDLL_THREAD_ATTACH://attachtothreadbreak;caseDLL_THREAD_DETACH://detachfromthreadbreak;}returnTRUE;//succesful}test.h代码/*DONOTEDITTHISFILE-itismachinegenerated*/#include<jni.h>/*Headerforclassctest_test*/#ifndef_Included_ctest_test#define_Included_ctest_test#ifdef__cplusplusextern"C"{#endif/**Class:ctest_test*Method:decrypt*Signature:([BLjava/lang/String;)[B*/JNIEXPORTjbyteArrayJNICALLJava_ctest_test_decrypt(JNIEnv*,jclass,jbyteArray,jstring);#ifdef__cplusplus}#endif#endif恳求前辈们指点一下,不知道是在哪里出错了网上搜索了很多还是没能解决。估计跟java方法签名有关,因为在网上查说是这样子,但是我核对了,找不出原因我用的ide是codeblock编译器是gnugcc在线等
解决方案
本帖最后由 ouchuquan 于 2014-05-12 17:24:39 编辑
解决方案二:
应该是参数类型错误。
解决方案三:
引用1楼fangmingshijie的回复:
应该是参数类型错误。
不晓得不知道从何入手测试
解决方案四:
自己顶一下,会的大神请指点下小弟,做了一天弄不出来,没办法耶
解决方案五:
另外2个demo与以上代码大致类似,一个报错:Exceptioninthread"main"java.lang.UnsatisfiedLinkError:ctest.GoodLuck.getString()Ljava/lang/String;atctest.GoodLuck.getString(NativeMethod)atctest.GoodLuck.main(GoodLuck.java:37)另一个报错:Exceptioninthread"main"java.lang.UnsatisfiedLinkError:ctest.HelloJni.displayHelloJni()Vatctest.HelloJni.displayHelloJni(NativeMethod)atctest.HelloJni.main(HelloJni.java:27)报错大概相同,应该属于同一错误,其实我之前GoodLuck这个demo能跑起来的,可是后来好像改了c++的编译器就不能跑了,可惜后来尝试更改编译器就是不成功,只怪粗心大意把能跑的demo给修改了。我现在有能跑的动态库文件可惜不懂反编译出来看。
解决方案六:
动态库能跑,用个软件看下。我记得有个什么creater的。以前用过,好久没玩忘了
解决方案七:
解决方案八:
引用6楼rui888的回复:这帖子也是关于jni问题的,可惜他的是找不到dll出错,我这里应该属于找不到方法类型的
解决方案九:
NDK下面的C++代码无法被JAVA识别:执行的过程中报错:C++的代码里面必须先声明:extern"C"{JNIEXPORTjbyteArrayJNICALLJava_ctest_test_decrypt(JNIEnv*env,jclasss,jbyteArraybyteArr,jstringstr);};这是因为生成的二进制文件中,C和C++的符号表不相同造成的。Jni是按照C的生成规则去找函数的,所以要加上externC使编译器把函数按照C的规则编译这样才能被JAVA调用
解决方案十:
也遇到这个问题,但是,我写了两个java工程,一个可以调用成功,在另一个调用就报这个错误,不懂啥原因。。。