关于Java使用JNI调用C++动态库进行回调的问题

问题描述

最近需要学习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什么的,能贴一下吗?

时间: 2024-08-30 16:13:05

关于Java使用JNI调用C++动态库进行回调的问题的相关文章

<急>关于jni调用第三方动态库不成功

问题描述 <急>关于jni调用第三方动态库不成功 我在自己的方法中调用第三方动态库的方法可是要么就报该方法没有定义要么就出现如下错误求解答在线等..!!!

Java通过JNI调用C语言的方法

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能. 解决JAVA对本地操作的一种方法就是JNI. JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式).通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法. 简单介绍及应用如下: 一.JAVA中所需要做的工作 在JAVA程序中,首先需要在类中声明所调

android-[NDK]关于NDK调用第三方动态库的问题

问题描述 [NDK]关于NDK调用第三方动态库的问题 假设现在有个动态库libOther.so,我调用了它里面的函数写了动态库libMy.so(以上都是x86下g++直接编译链接的) 现在我有一个android应用打算用libMy.so里的函数,最终封装成NDK下的动态库main.so, 请问在NDK下应该如何build? 本人NDK小白,能否详细说下: 1.两个(Other 和 My)动态库放哪? 2.两个动态库对应的头文件放哪? 3.mk文件应该如何修改? 4.JNI实现的main.cpp应

请问web开发中,js调用DLL动态库,同一台pc机调用了不同的动态库,有的动态库调不到,怎么办?

问题描述 请问web开发中,js调用DLL动态库,同一台pc机调用了不同的动态库,有的动态库调不到,怎么办? 两个动态库,一个医保刷卡的,一个刷POS的,单独使用POS机,能正常使用,但是如果之前使用过医保刷卡机,就不能进入POS的动态库了,感觉像是冲突了一样,哪个大神能帮忙解决一下. 解决方案 两个动态库,一个医保刷卡的,一个刷POS的,单独使用POS机,能正常使用,但是如果之前使用过医保刷卡机,就不能进入POS的动态库了,感觉像是冲突了一样,哪个大神能帮忙解决一下.

dll动态库-python 调用DLL 动态库之后 怎么释放

问题描述 python 调用DLL 动态库之后 怎么释放 各位大神,请问python 利用 ctypes调用DLL之后怎么释放啊 解决方案 不需要释放,CDLL析构中会自动释放

c++-C#调用C++动态库DLL中的函数

问题描述 C#调用C++动态库DLL中的函数 C#调用C++动态库DLL中的函数,此函数参数中有bool(小写)类型的参数.c#该如何进行转换 解决方案 C#调用C++动态库dllC#调用C++动态库(dll)C#动态调用C++编写的DLL函数 解决方案二: bool类型的true 或false一般对应1和0.有的语言没有bool类型的.传递参数时可用整型替代. 解决方案三: public static extern int RD_CloseCom(bool IsOpen); 解决方案四: 在C

c#-窗体程序调用别人动态库成功,控制台应用程序不成功

问题描述 窗体程序调用别人动态库成功,控制台应用程序不成功 C#调用别人的动态库,用窗体程序调用成功 用控制台应用程序调用不成功 解决方案 1.在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击"确定". 2.在应用文件头处使用using ×××: 3.控制台下面在main中调用. 第一次回答问题,不知道对你有木有帮助

java用jni调用下面C++,如何传参取值

问题描述 java用jni调用下面C++,如何传参取值 #include <iostream> #include <afx.h> #include <tchar.h> #include <ctime> #include<winsock.h> unsigned char posmstkey[9]={0x12,0x23,0x35,0x56,0x55,0x33,0x98,0x11}; char starC[56],starD[56],starK[17]

c#调用c++动态库 char* []类型

问题描述 DWORD__stdcallDBPCreate(char*sips[],char*susers[],char*spasss[],WORDwport[],intnsize);c#调用c++动态库,这个函数怎么导入 解决方案 解决方案二:[DllImport]staticexternintDBPCreate(byte[][]sips,byte[][]susers,byte[][]spasss,ushort[]wport,intnsize);解决方案三:char*可以用StringBuild