Neko Dlls in Haxe C++ target

Neko Dlls in Haxe C++ target

本文关键字:C++ target Haxe in Dlls Neko      更新时间:2023-10-16

我正在尝试使用Neko dlls(用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);
     }
 }

仅当函数不采用参数时,它才会执行。此外,从 Haxe 的C++函数返回的值是 null

当我为 neko 目标编译时,这段代码实际上可以完美运行,但它似乎不适用于 cpp 目标。

任何帮助,不胜感激。

这是完全更正的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("%in", 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 类型,因此打印代码是正确的。但是你的返回是错误的:当函数期望你向Haxe返回value时,你不能返回C int类型。您需要创建一个新的 Haxe Int 类型并将其返回。这是在alloc_int的帮助下完成的。

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

class Main
{
    static var hello = cpp.Lib.load("myLib", "hello", 1);
    static function main()
    {
        var myReturnedInt:Int = hello(1);
    }
}

一些有用的链接:

  • 内科·
  • 内科 FFI 教程
  • CPP FFI 说明

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

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

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

#define NEKO_COMPATIBLE

在 hx/CFFI.h 之前包括。

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

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