Neko Dlls在Haxe C ++目标中

时间:2012-05-02 16:10:26

标签: c++ haxe

我正在尝试使用Nex 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目标。

感谢任何帮助。

2 个答案:

答案 0 :(得分: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);

重要的是,作为基元的参数或由基元返回的每个值必须是value类型。这就是你的参数和返回不起作用的原因。

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

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

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

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

一些有用的链接:

答案 1 :(得分:1)

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

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

(而不是neko&#39;标题) 如果你想让ndll同时在neko和hxcpp上运行,你还应该添加

#define NEKO_COMPATIBLE

在hx / CFFI.h之前包括。

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

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