c++回调函数调用java接口抽象函数

上传人:wm****3 文档编号:43305039 上传时间:2018-06-05 格式:DOC 页数:8 大小:15.31KB
返回 下载 相关 举报
c++回调函数调用java接口抽象函数_第1页
第1页 / 共8页
c++回调函数调用java接口抽象函数_第2页
第2页 / 共8页
c++回调函数调用java接口抽象函数_第3页
第3页 / 共8页
c++回调函数调用java接口抽象函数_第4页
第4页 / 共8页
c++回调函数调用java接口抽象函数_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《c++回调函数调用java接口抽象函数》由会员分享,可在线阅读,更多相关《c++回调函数调用java接口抽象函数(8页珍藏版)》请在金锄头文库上搜索。

1、C+C+回调函数调用回调函数调用 JavaJava 接口抽象函数接口抽象函数C+回调函数调用 Java 接口抽象函数分类: C/C+项目中很多代码采用 C+编写,配置界面则采用 BS 结构,使用Java 语言进行设置。因此需要实现 Java 调用 C+编写的函数库(dll文件或 so 文件),采用的技术为 JNI(Java Native Interface),对于常用的调用方式在The Java Native Interface Programmers Guide and Specification一书中有详细的描述,不在进行描述。本文中主要介绍在动态链接库中如果含有回调函数作为函数参数的C+

2、函数如何使用 JNI 实现调用。在 C+中函数定义格式为:typedef int (*UserProcess)(int nEncrptType);CALLBACK_API int Process(UserProcess cb,int nCompanID);即如何采用 Java 语言实现 Process 函数?下面将分别针对 C+和Java 语言使用回调函数进行说明。1.回调函数库本文中定义了一个简单的回调函数接口,目的是根据公司 ID 进行加密,加密函数为回调函数。头文件定义如下#ifdef CALLBACK_EXPORTS#define CALLBACK_API _declspec(dlle

3、xport)#else#define CALLBACK_API _declspec(dllimport)#endif#ifdef _cplusplusextern “C“#endiftypedef int (*UserProcess)(int nEncrptType);CALLBACK_API int Process(UserProcess cb,int nCompanID);#ifdef _cplusplus#endif其实现文件为#include “stdafx.h“#include “CallBack.h“CALLBACK_API int Process(UserProcess cb,i

4、nt nCompanID)if(cb = NULL)return -1;cb(nCompanID);return 0;2.C+语言使用回调函数库用法比较简单,直接实现一个满足 UserProcess 定义的函数,然后将其传递给 Process 函数即可,见下文代码内容。#include “stdafx.h“#include “./CallBack/CallBack.h“int WanporProcess(int i)printf(“Process = %dn“,i);return i;int _tmain(int argc, _TCHAR* argv)Process(WanporProcess

5、,100);return 0;加密函数将公司 ID 直接输出,未进行其他处理。3.Java 语言使用回调函数这个过程相对于 C+显得比较繁琐,主要包含以下一个过程:3.1 编写回调函数的抽象接口,并实现一个回调类;3.2 在 JNI 中安装回调接口类3.3 实现 C+的回调函数,在此回调函数中获取抽象接口类对象、回调函数的接口名称、调用回调函数3.4 调用 process 进行回调函数执行2.5 卸载回调类下面依次实现上述中的内容3.1 回调函数接口定义package .wanpor;/编写回调函数接口public interface CBInterfacepublic abstract in

6、t UserProcess(int encryptType);3.2 实现回调类/实现回调类class WanporCB implements CBInterface public int UserProcess(int encryptType)System.out.println(“Java = “ + 3*encryptType);return 0;3.3C+ JNI 代码中安装回调类#include “stdafx.h“#include “./CallBack/CallBack.h“#include “cn_com_wanpor_CallBackJNI.h“typedef struct

7、CBDataUserProcess m_pfnUserProcess;jobject m_objInterface;JNIEnv* m_pEnv;jobject m_objCallBack;CBData;CBData g_cbData;JNIEXPORT jint JNICALL Java_cn_com_wanpor_CallBackJNI_setUserCallBack(JNIEnv * env, jobject obj, jobject cb)g_cbData.m_pEnv = env;g_cbData.m_objCallBack = env-NewGlobalRef(obj);g_cbD

8、ata.m_objInterface = env-NewGlobalRef(cb);return 0;3.4 实现 C+回调函数int ProcessJNICB(int nEncrpytType)JavaVM* pVm;g_cbData.m_pEnv-GetJavaVM(pVm-AttachCurrentThread(void*)jclass jclsProcess = g_cbData.m_pEnv-GetObjectClass(g_cbData.m_objInterface);if (jclsProcess = NULL)printf(“jclsProcess = NULLn“);retu

9、rn -1;jmethodID jmidProcess = g_cbData.m_pEnv-GetMethodID(jclsProcess,“UserProcess“,“(I)I“);if (jmidProcess = NULL)printf(“jmidProcess = NULLn“);return -2;g_cbData.m_pEnv-CallIntMethod(g_cbData.m_objInterface,jmidProcess,nEncrpytType);pVm-DetachCurrentThread();return 0;3.5 执行回调函数JNIEXPORT jint JNICA

10、LL Java_cn_com_wanpor_CallBackJNI_process(JNIEnv * env, jobject obj, jint nCompanyID)Process(ProcessJNICB,nCompanyID);return 0;3.6 卸载回调类JNIEXPORT jint JNICALL Java_cn_com_wanpor_CallBackJNI_resetUserCallBack(JNIEnv * env, jobject objCallBack, jobject objInterface)g_cbData.m_pEnv-DeleteGlobalRef(objI

11、nterface);g_cbData.m_pEnv-DeleteGlobalRef(objCallBack);return 0;4.Java 测试程序下面的代码是对 JNI 接口的测试程序,WanporCB 实现了回调接口,回调函数返回值为 0,但打印出 3*nCompany 的值,程序执行函数的顺序是:创建回调函数接口实例创建测试对象安装回调类执行加密卸载回调类代码如下:package .wanpor;/实现回调类class WanporCB implements CBInterface public int UserProcess(int encryptType)System.out.pr

12、intln(“Java = “ + 3*encryptType);return 0;public class CallBackJNIstaticSystem.load(“E:Program FilesJavajdk1.5.0_15binCallBackJNI.dll“);/设置回调函数public native int setUserCallBack(CBInterface cb);/清除回调函数public native int resetUserCallBack(CBInterface cb);/执行用户自定义加密public native int process(int companyID);/测试程序public static void main(String argv)CallBackJNI cbj = new CallBackJNI();WanporCB wcb = new WanporCB();cbj.setUserCallBack(wcb);cbj.process(300);cbj.resetUserCallBack(wcb);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号