【发布时间】:2018-11-14 13:59:10
【问题描述】:
这超出了我的想象,所以我们开始吧。
我在 C++ 中使用接口 Java 对象设置函数指针,该对象在 Java 端看起来像这样:
Info_t info_t = new Info_t();
info_t.setCallbackTest(new CallbackTest() {
@Override
public void onCallback(int num) {
System.out.println("callback: " + num);
}
});
其中CallbackTest() 是只有一种方法的接口:
public interface CallbackTest {
void onCallback(int num);
}
而setCallbackTest()指的是Java原生方法,它反映在C++端是这样的:
JNIEnv *gbl_env;
jmethodID gbl_method;
jobject gbl_callback;
void WrapperFunction(int a) {
gbl_env->ExceptionClear();
gbl_env->CallVoidMethod(gbl_callback, gbl_method, a);
if(gbl_env->ExceptionOccurred()) {
gbl_env->ExceptionClear();
}
return;
}
JNIEXPORT void JNICALL Java_apiJNI_Info_1t_1callbackTest_1set(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jobject jarg2) {
Info *arg1 = (Info *) 0;
(void) jenv;
(void) jcls;
(void) jarg1_;
arg1 = *(Info **)&jarg1;
{
jclass clazz;
jmethodID mid;
clazz = jenv->GetObjectClass(jarg2);
mid = jenv->GetMethodID(clazz, "onCallback", "(I)V");
if(mid == 0) {
std::cout << "could not get method id" << std::endl;
return;
}
gbl_env = jenv;
gbl_method = mid;
gbl_callback = jarg2;
}
// here I am setting function pointer to the helper method which invokes the java code
if(arg1) (arg1)->completionCB = WrapperFunction;
}
所有这些都是基于Implement callback function in JNI using Interface写的
我尝试在 C++ 端调用 Java 中定义的 onCallback() 方法,它可以工作(就像上面的链接中一样),但现在我试图在 C++ 下的 struct 上设置值
typedef void (*callbackFunction)(int);
typedef struct Info
{
callbackFunction completionCB;
void *caller;
} Info_t;
所以稍后在某个时候,我想将callbackFunction completionCB 作为一个对象返回给 Java,并可能用它做各种事情。
我的问题是如何将函数指针行为从 C++ 返回/映射回 Java 对象?基本上,我想做同样的事情,但顺序相反。我现在可以将 Java 接口映射到函数指针上,我想将函数指针行为映射到 Java 对象上。
编辑:到目前为止,我已经想出了这样的吸气剂,但我不确定如何继续
JNIEXPORT jobject JNICALL Java_apiJNI_Info_1t_1callbackTest_1get(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) {
jobject jresult = 0;
Info *arg1 = (Info *) 0;
callbackFunction result;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(Info **)&jarg1;
result = ((arg1)->completionCB);
{
jclass clazz = jenv->FindClass("com/CallbackTest");
???
}
???
return ;
}
【问题讨论】:
标签: java c++ java-native-interface function-pointers swig