我正在尝试使用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目标。
感谢任何帮助。
答案 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