gpt4 book ai didi

haxe - 从 Haxe 传递给 C++ 的对象中的调用方法

转载 作者:行者123 更新时间:2023-12-05 00:45:44 25 4
gpt4 key购买 nike

我正在为移动广告 SDK 创建一个 OpenFL 扩展,但我很难弄清楚一些 CFFI 的东西。

基本上,我试图将 Haxe 对象传递给 C++,然后从 C++ 调用该对象的方法。这样做的目的是作为事件监听器,因此当 C++ 中发生某些事情时,我会在该对象上调用回调以通知 Haxe 代码。

我知道如何使用 Lime 的 Android JNI 东西用 Java 做到这一点。使用 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 类似。但是,一旦我得到 value在 C++ 端键入,我不知道如何在其上调用成员函数。

例如,假设我的 C++ 函数如下所示:
#include <hx/CFFI.h>
static void setCallbackListener (value listener) {
//...
}
DEFINE_PRIM (setCallbackListener, 1);

我如何在 listener 中调用函数“onSomething”? ?

最佳答案

经过一番挖掘,我想通了!不幸的是,这些似乎都没有记录,所以我想我会在这里发布我的发现,以防其他人想做同样的事情。

方法一

hxcpp C API 显然与 Neko API 非常相似,但并不完全相同。尽管如此,Neko documentation是一个很好的起点。

该页面向您展示了如何使用 val_call0 调用函数。 , val_call1等。它没有向您展示的是如何从实例中获取对所需函数的引用。为此,您可以使用函数 val_idval_field像这样一起(这是用于 hxcpp,不确定它是否也适用于 Neko):

#include <hx/CFFI.h>
#include <hx/CFFIAPI.h>
static void setCallbackListener (value listener) {

//get the field "id" from the name, which seems like a generic hash
field fid = val_id("onSomething");

//get the function from `listener`
value myfunc = val_field(
listener, //class instance allocated in haxe (type `value`)
fid
);

//optionally verify that `myfunc` is 1) a function and 2) accepts 0 arguments
//throws haxe error if this check fails
val_check_function(myfunc, 0);

//perform the call to `listener.onSomething()`
val_call0(myfunc);
}
DEFINE_PRIM (setCallbackListener, 1);

如果函数采用 2 个参数而不是 1 个(例如),那么您将使用 val_call2 ,并这样称呼它:
value arg1 = alloc_string("foo");
value arg2 = alloc_bool(true);
val_call2(myfunc, arg1, arg2); //arguments are of type `value`

还有 val_callN它接受任意数量的参数。见 declaration here .

引用: https://github.com/HaxeFoundation/hxcpp/blob/master/project/libs/std/Socket.cpp#L1039

方法二

幸运的是,当我用 Google 搜索“hxcpp val_call”(不带引号)和 one of those links detailed this method. 时,只有 3 个结果。

只需阅读该线程以获得完整的解释。如果您需要更好的内存管理,该方法可能是首选,因为它还显示了如何从 C++ 连接到 hxcpp GC。

免责声明

我在 val_id 上找不到任何实际文档和 val_field ,因此这些方法可能不打算在外部使用,并且可能会在更高版本的 hxcpp 中更改。我不知道。 🤷‍♂️

关于haxe - 从 Haxe 传递给 C++ 的对象中的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com