Neko Dlls in Haxe C++ target
Neko Dlls in Haxe C++ target
我正在尝试使用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
相关文章:
- CMake "--target install"无需"--build"命令行
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- Visual Studio Professional 2013, Update 5, "No Target Architecture"
- 如何在.pro文件中为TARGET使用空格和尖括号
- antlr cpp target 的标头部分不允许使用具有默认参数的外部函数
- 生成错误:"cannot find target for file"和"undefined reference"
- 你如何修复'cmake ..&&&使安装' "No rule to make target install" ?
- 如何获取字符*的实际长度?strlen 和 sizeof(target)/sizeof(target*)之间的区别?
- Makefile for host & target
- CMake: Hide -WShadow global compile flag for child target
- CMake 错误:'target is not built by this project'
- "No target" 在代码中"no project"问题::块
- GNU make 3.81 - 如何做'--output-sync=target'
- 如何在 OpenMP 4 中为 std::vector 编写"target data map"?
- Eclipse 无法执行 MI 命令 -target-select remote
- Antlr4 C++ target
- IPlugEffect (Audio Unit target) "SysError 0 during open of " resource.h " "
- 使用 Boost.Log "error: target { simple_event_log.mc. } has no type" 构建 Boost
- 为什么QDrag::target()在QDrag::exec()之后返回一个奇怪的地址
- GNU gcc mysys make command no rule to make target libpng