C++回调函数调用Java接口抽象函数
来源:互联网 发布:金蝶进销存软件免费版 编辑:程序博客网 时间:2024/05/14 08:08
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(dllexport)
#else
#define CALLBACK_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
typedef 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,int nCompanID)
{
if(cb == NULL)
{
return -1;
}
cb(nCompanID);
return 0;
}
用法比较简单,直接实现一个满足UserProcess定义的函数,然后将其传递给Process函数即可,见下文代码内容。
#include"stdafx.h"
#include "../CallBack/CallBack.h"
int WanporProcess(int i)
{
printf("Process = %d\n",i);
return i;
}
int _tmain(int argc, _TCHAR* argv[])
{
Process(WanporProcess,100);
return 0;
}
3.Java语言使用回调函数
这个过程相对于C++显得比较繁琐,主要包含以下一个过程:
3.1编写回调函数的抽象接口,并实现一个回调类;
3.2在JNI中安装回调接口类
3.3实现C++的回调函数,在此回调函数中获取抽象接口类对象、回调函数的接口名称、调用回调函数
3.4调用process进行回调函数执行
2.5卸载回调类
下面依次实现上述中的内容
3.1回调函数接口定义
package cn.com.wanpor;
//编写回调函数接口
public interface CBInterface{
public abstractint UserProcess(int encryptType);
}
//实现回调类
class WanporCB implements CBInterface{
public int UserProcess(int encryptType){
System.out.println("Java = "+ 3*encryptType);
return 0;
}
}
#include"stdafx.h"
#include "../CallBack/CallBack.h"
#include "cn_com_wanpor_CallBackJNI.h"
typedef struct CBData{
UserProcess 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_cbData.m_objInterface = env->NewGlobalRef(cb);
return 0;
}
int ProcessJNICB(int nEncrpytType)
{
JavaVM* pVm;
g_cbData.m_pEnv->GetJavaVM(&pVm);
pVm->AttachCurrentThread((void**)&g_cbData.m_pEnv,NULL);
jclass jclsProcess = g_cbData.m_pEnv->GetObjectClass(g_cbData.m_objInterface);
if (jclsProcess== NULL)
{
printf("jclsProcess = NULL\n");
return -1;
}
jmethodID jmidProcess = g_cbData.m_pEnv->GetMethodID(jclsProcess,"UserProcess","(I)I");
if (jmidProcess== NULL)
{
printf("jmidProcess = NULL\n");
return -2;
}
g_cbData.m_pEnv->CallIntMethod(g_cbData.m_objInterface,jmidProcess,nEncrpytType);
pVm->DetachCurrentThread();
return 0;
}
JNIEXPORT jint JNICALL Java_cn_com_wanpor_CallBackJNI_process
(JNIEnv * env, jobject obj, jint nCompanyID)
{
Process(ProcessJNICB,nCompanyID);
return 0;
}
JNIEXPORT jint JNICALL Java_cn_com_wanpor_CallBackJNI_resetUserCallBack
(JNIEnv * env, jobject objCallBack, jobject objInterface)
{
g_cbData.m_pEnv->DeleteGlobalRef(objInterface);
g_cbData.m_pEnv->DeleteGlobalRef(objCallBack);
return 0;
}
下面的代码是对JNI接口的测试程序,WanporCB实现了回调接口,回调函数返回值为0,但打印出3*nCompany的值,程序执行函数的顺序是:
创建回调函数接口实例
创建测试对象
安装回调类
执行加密
卸载回调类
代码如下:
package cn.com.wanpor;
//实现回调类
class WanporCB implements CBInterface{
public int UserProcess(int encryptType){
System.out.println("Java = "+ 3*encryptType);
return 0;
}
}
public class CallBackJNI{
static{
System.load("E:\\Program Files\\Java\\jdk1.5.0_15\\bin\\CallBackJNI.dll");
}
//设置回调函数
public nativeint setUserCallBack(CBInterface cb);
//清除回调函数
public nativeint resetUserCallBack(CBInterface cb);
//执行用户自定义加密
public nativeint process(int companyID);
//测试程序
public staticvoid main(String[] argv){
CallBackJNI cbj = new CallBackJNI();
WanporCB wcb = new WanporCB();
cbj.setUserCallBack(wcb);
cbj.process(300);
cbj.resetUserCallBack(wcb);
}
}
- C++回调函数调用Java接口抽象函数
- C++回调函数调用Java接口抽象函数
- C++回调函数调用Java接口抽象函数
- C++回调函数调用Java接口抽象函数
- c的回调函数与java中抽象函数,接口函数,抽象类简单理解
- c#调用c++dll接口及回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java/Android中的函数调用&回调函数&自定义回调函数
- Java调用C语言Dll库回调函数
- 4.8 抽象接口, 回调函数: 短信备份
- 函数调用习惯与回调函数
- 关于回调函数和函数调用
- C# 调用C/C++回调函数
- c风格回调函数 vs c++风格虚基类,关于接口定义和调用的对比
- Java回调函数之callback接口
- 英语练习50 Don't mention it
- javascript常用函数+技巧
- 智力题集锦【二】
- flex 模态对话框背景属性更改
- php判断数组是否有序
- C++回调函数调用Java接口抽象函数
- 怎么判断一颗二叉树是完全二叉树
- 猎人与猎狗的故事
- 程序员,你的一千万在哪里?
- java程序员的迷茫?
- java核心技术8--笔记(3)_5章
- OK6410实现软件关闭背光
- 关于C++ const 的全面总结
- S3C2440与SDRAM的地址连线分析