【发布时间】:2019-05-18 01:03:25
【问题描述】:
我正在为移动广告 SDK 创建一个 OpenFL 扩展,但我很难弄清楚一些 CFFI 内容。
基本上,我试图将 Haxe 对象传递给 C++,然后从 C++ 调用该对象的方法。这样做的目的是作为一个事件监听器,所以当 C++ 中发生某些事情时,我会在该对象上调用回调来通知 Haxe 代码。
我知道如何在 Java 中使用 Lime 的 Android JNI 东西来做到这一点。使用JNI type signatures 看起来像这样:
var setCallbackListener = JNI.createStaticMethod("com.test.myextension", "setCallbackListener", "(Lorg/haxe/lime/HaxeObject;)V");
var listener = new MyCallbackListener(); //implements `onSomething`
setCallbackListener(listener); //pass the listener to the Java side
然后从Java端,我可以像这样调用函数onSomething:
public static void setCallbackListener(HaxeObject listener){
listener.call0("onSomething"); //call a function called "onSomething" with zero arguments
}
这很有效,这就是我在 Android 上的做法。对于 iOS,我正在尝试做同样的事情,但使用的是 hxcpp。
我知道从 Haxe 调用 C++ 函数的一般过程,使用 cpp.Lib.load 以类似于上面的 JNI api 的方式。但是,一旦我在 C++ 端获得了 value 类型,我不知道如何在其上调用成员函数。
例如,假设我的 C++ 函数如下所示:
#include <hx/CFFI.h>
static void setCallbackListener (value listener) {
//...
}
DEFINE_PRIM (setCallbackListener, 1);
我如何在listener 中调用函数“onSomething”?
【问题讨论】: