c++回调java

最近的项目中用到了c++回调java,试了很多方法,有通过jni的方式,也有jna的方式,jni复杂很多,相反jna就简单不少,jna为jnative,JNative 可以让你方便的访问 Windows 平台下的 DLL 以及 Linux 平台下的 so 动态连接库文件,无需在编写一行 C/C++ 代码,JNative 是动态的。下面是我的测试demo。

1、首先建立一个动态库文件,这里用vs2005.新建一个dll工程即可。下面是dll工程需要的两个文件

JNativeTest.h:为头文件,申明dll中的导出函数。这里申明了一个函数指针(pfCallbackTest)和一个导出函数(RegCallback

#ifndef JNativeTes_H 
#define JNativeTes_H 


#ifdef JNATIVETEST_EXPORTS 
#define JNATIVETEST_API extern "C" __declspec(dllexport) 
#else 
#define JNATIVETEST_API __declspec(dllimport) 
#endif 


typedef void (*pfCallbackTest)(char * msg, char* data, int type); /*回调函数声明*/ 


JNATIVETEST_API void RegCallback(pfCallbackTest ev, char *msg, char *data, int type); 


#endif 

JNativeTest.cpp:为实现文件,在cpp文件中实现了导出函数,在函数中调用了回调函数



#include "JNativeTest.h" 
#include "stdio.h"


/*注册回调*/ 


void RegCallback(pfCallbackTest ev, char *msg, char *data, int type) 

ev(msg, data, type);
printf("callbackcallback\n");

编译,即可生成dll文件。


3、下载jnative:http://sourceforge.net/projects/jnative/files/


2、下载好后是个jar文件,导入到eclipse工程中,添加java代码,一个是回调类的代码,一个测试代码

TestCallback.java:回调类代码,回调类要实现Callback接口,并实现Callback的两个方法,一个是callback,这个是用来获取回调函数的参数,并在此方法中

实现自己的业务逻辑,这个方法相当于回调函数。另一个需要实现的抽象接口是getCallbackAddress,这个方式可以获取回调函数的地址,在调用c++中的接口测试的时候,需要传入回调函数的函数指针,就可以把getCallbackAddress获取的函数地址传进去。另外,要把dll文件拷贝到java工程的目录中,这样jnative才能找到此dll。

package TestCallback;


import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.*;
import org.xvolks.jnative.util.Callback;


/**
 * @date 2009-3-17
 * @author charis
 * @Copyright (c) qqtech All rights reserved. http://www.qqtech.com
 */
public class TestCallback implements Callback/* 实现此接口 */{


public TestCallback() {


}


/**
* Method callback java对应于dll中的回调函数

* @param values
*            an long[] 参数数组,非整型数代表的都是地址
* @return an int
* @version 3/17/2008
*/
public int callback(long[] values) {
if (values == null) {
System.err.println("callback ret " + 3);
return 3;
}
if (values.length == 3) {
String name = "";
try {
Pointer _pointer = Pointer.createPointerToNativeMemory(
(int) values[0], 100); /* 获取字符串通过指针 */
Pointer _pointer1 = Pointer.createPointerToNativeMemory(
(int) values[1], 100);


name = _pointer.getAsString() + "\n" + _pointer1.getAsString();


} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.err.println(name + "\n" + values[2]);


return 1;
} else {
System.err.println("Bad number of arguments ! 3 expected "
+ values.length + " found");
System.err.println("callback ret " + 2);
return 2;
}
}


/**
* java回调函数地址
*/
public int getCallbackAddress() throws NativeException {
return JNative.createCallback(3/* 回调函数参数数目 */, this);
}

}

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在C++回调Java方法,需要使用Jni接口来实现。下面是一个简单的示例代码,它演示了如何在C++回调Java中的一个方法: 首先,在Java中定义需要被回调的方法: ```java public class Callback { public void onCallback() { System.out.println("Callback called from C++"); } } ``` 然后,在C++中通过Jni接口加载Java类和方法: ```c++ #include <jni.h> jmethodID methodId; jclass clazz; JNIEnv* env; JNIEXPORT void JNICALL Java_Callback_init(JNIEnv* jenv, jobject jobj) { env = jenv; clazz = env->GetObjectClass(jobj); methodId = env->GetMethodID(clazz, "onCallback", "()V"); } JNIEXPORT void JNICALL Java_Callback_call(JNIEnv* jenv, jobject jobj) { env->CallVoidMethod(jobj, methodId); } ``` 在上述代码中,init()方法用于初始化Jni环境和获取Java类和方法的引用。call()方法用于在C++中调用Java方法。 最后,在Java中调用C++回调函数: ```java public class Main { static { System.loadLibrary("callback"); } public static void main(String[] args) { Callback callback = new Callback(); init(callback); call(callback); } private static native void init(Callback callback); private static native void call(Callback callback); } ``` 其中,init()和call()方法都是native方法,它们在C++中实现了对应的回调函数。 需要注意的是,在C++回调Java方法时,需要使用JNIEnv来管理Jni环境,以确保线程安全和内存管理的正确性。同时,为了方便使用,可以使用Jni的自动绑定工具来简化Jni接口的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

andy492943457

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值