3

我正在尝试将 Neko dll(用 C++ 编写)与 Haxe 的 C++ 目标一起使用。我可以在 haxe 中调用函数,但不能传递值。

这是 C++ 代码 -

value Hello(value h)
{
    cout << val_int(h);
    return val_int(1);
}DEFINE_PRIM(Hello, 1);

这是 Haxe 代码 -

class Main
{
     var load = cpp.Lib.loadLazy( "ndll" , "Hello", 1 );
     static function main()
     {
          load(1);
     }
 }

它仅在函数不带参数时执行。此外,从 C++ 函数返回给 Haxe 的值是null.

当我为 neko 目标编译时,这段代码实际上工作得很好,但它似乎不适用于 cpp 目标。

任何帮助表示赞赏。

4

2 回答 2

8

这是完全更正的 C++ 代码:

#define IMPLEMENT_API

/* Will be compatible with Neko on desktop targets. */
#if defined(HX_WINDOWS) || defined(HX_MACOS) || defined(HX_LINUX)
    #define NEKO_COMPATIBLE
#endif

#include <hx/CFFI.h>
#include <stdio.h>

/* Your hello function. */
value hello(value h)
{
    printf("%i\n", val_int(h));
    return alloc_int(1);
}
DEFINE_PRIM(hello, 1);

/* Main entry point. */
extern "C" void mylib_main()
{
    // Initialization code goes here
}
DEFINE_ENTRY_POINT(mylib_main);

重要的是,作为原语的参数给出或由原语返回的每个值都必须是 type value。这就是为什么您的参数和返回不起作用的原因。

val_int用于将 avalue转换为本机 C 类型,因此您的打印代码是正确的。int但是您的返回是错误的:当函数希望您将 a 返回value给 Haxe时,您不能返回 C类型。您需要创建一个新的 HaxeInt类型并将其返回。这是在 的帮助下完成的alloc_int

这是代码的 Haxe 部分作为参考:

class Main
{
    static var hello = cpp.Lib.load("myLib", "hello", 1);

    static function main()
    {
        var myReturnedInt:Int = hello(1);
    }
}

一些有用的链接:

于 2012-05-03T07:30:53.703 回答
1

为了使它工作,您必须添加到您的 cpp 文件的标题中:

#define IMPLEMENT_API
#include <hx/CFFI.h>

(而不是 neko 的标头)如果您希望 ndll 在 neko 和 hxcpp 上运行,您还应该添加

#define NEKO_COMPATIBLE

在 hx/CFFI.h 包括之前。

您可以使用最适合您的任何方式进行编译,但我建议使用 Build.xml 来生成您的 ndll,因为它会自动为 hxcpp 的标头正确添加包含和 lib 路径。您可以在这里看到一个非常简单的 Build.xml 示例:http: //pastebin.com/X9rFraYp

您可以在此处查看有关 hxcpp 的 CFFI 的更多文档:http: //haxe.org/doc/cpp/ffi

于 2012-05-03T00:42:53.903 回答