问题描述
最近需要学习JNI去调用C++动态链接库,所以写了个小实例试下JAVA调用C++库中的回调问题。代码如下JAVA层代码packagezm.com;publicclassLog{/***@paramargs*/static{//System.loadLibrary("JniLib");System.load("C:\VC_TEST\JniLib\Debug\JniLib.dll");}publicvoidoutput(Stringout){System.out.println(out);}publicnativevoidTest(Loglog);publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubLoglog=newLog();log.Test(log);}}
以下是C++库代码#include"stdafx.h"#include"zm_com_Log.h"BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){returnTRUE;}//JNIEXPORTvoidJNICALLJava_ZM_1JNI_Log_Test//(JNIEnv*env,jobjectobj,jobjectlog)JNIEXPORTvoidJNICALLJava_zm_com_Log_Test(JNIEnv*env,jobjectobj,jobjectlog){jclasscls;//cls=env->GetObjectClass(env,log);cls=env->GetObjectClass(log);jmethodIDjMid=env->GetMethodID(cls,"output","(Ljava/lang/String;)V");jstringinfo=env->NewStringUTF("Hi,whatthefuck.");env->CallVoidMethod(cls,jMid,info);env->ReleaseStringUTFChars(info,env->GetStringUTFChars(info,FALSE));}
在使用JAVA进行调试的时候,出现了错误。使用打印信息调试,是在C++库中的env->CallVoidMethod(cls,jMid,info);这一段有问题,但始终不明白这段有什么问题。请问有人知道问题出在哪里,怎么修改?
解决方案
解决方案二:
错误:env->CallVoidMethod(cls,jMid,info);正确:env->CallVoidMethod(log,jMid,info);理由:output是定义在log里面的,而不是cls里的
解决方案三:
引用1楼Android_iPhone的回复:
错误:env->CallVoidMethod(cls,jMid,info);正确:env->CallVoidMethod(log,jMid,info);理由:output是定义在log里面的,而不是cls里的
试了你的方法,不行。不过还是要谢谢你,还有其他建议吗?
解决方案四:
引用2楼qq_1648的回复:
Quote: 引用1楼Android_iPhone的回复:
错误:env->CallVoidMethod(cls,jMid,info);正确:env->CallVoidMethod(log,jMid,info);理由:output是定义在log里面的,而不是cls里的试了你的方法,不行。不过还是要谢谢你,还有其他建议吗?
我在自己的机器上,运行OK了的不行的具体的截屏或者LOG什么的,能贴一下吗?