Haxe CFFI

1 简述

cffi全称 C Foreign Function Interface,相当于jni之于java

2 cpp端

2.1 编写

需要在头部加上

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

若希望支持neko,则需要在include前加上

#define NEKO_COMPATIBLE

需要被调用的方法需对应如下代码

DEFINE_PRIM(方法名, 参数数量);

例如:

#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);

2.2 编译为ndll

可用gcc等编译: g++ ./src/test.cpp -shared -o ./bin/test.ndll -I./include -w

或编写build.xml后执行 haxelib run hxcpp Build.xmllime rebuild xxx

xml中从

<target id="default"> 
  <target id="systools" /> 
</target>

读取,若子项直接 /> 结束,则查找id相同项并继续读取。 例如:

<xml>
<include name="${HXCPP}/build-tool/BuildCommon.xml"/>
<set name="platform_dir" value="./mac/" if="macos"/>
<set name="platform_dir" value="./win/" if="windows"/>
<set name="platform_dir" value="./linux/" if="linux"/>
<set name="tool" value="exe" unless="iphone"/>
<set name="tool" value="static" if="iphone"/>

<files id="systools" dir="./src">
	<compilerflag value="-I./src"/>
	<compilerflag value="$(pkg-config --libs --cflags gtk+-2.0)" if="linux"/>
	<compilerflag value="$(pkg-config --libs --cflags gconf-2.0)" if="linux"/>
	<file name="api.cpp" />
	<file name="${platform_dir}clipboard.c" />
	<file name="${platform_dir}dialogs.c" />
	<file name="${platform_dir}fileutils.c" />
	<file name="${platform_dir}misc.c" />
	<file name="${platform_dir}registry.c" />
	<file name="${platform_dir}browser.c" unless="linux" />
	<file name="${platform_dir}display.c" unless="linux" />
	<file name="${platform_dir}menus.c" if="windows" />
	<file name="${platform_dir}win.c" if="windows" />
</files>

<files id="mac" dir="./src">
	<compilerflag value="-I./src"/>
	<file name="api.cpp" />
	<file name="mac/browser.m" />
	<file name="mac/clipboard.m" />
	<file name="mac/dialogs.m" />
	<file name="mac/display.m" />
	<file name="mac/fileutils.m" />
	<file name="mac/misc.m" />
	<file name="mac/registry.m" />
</files>

<target id="systools" output="${LIBPREFIX}systools${DBG}${LIBEXTRA}" tool="linker" toolid="${STD_MODULE_LINK}">
  <ext value=".ndll" unless="mobile"/>
  <files id="systools" unless="macos"/>
  <files id="mac" if="macos"/>
  <lib name="kernel32.lib" if="windows"/>
  <lib name="user32.lib" if="windows"/>
  <lib name="comdlg32.lib" if="windows"/>
  <lib name="advapi32.lib" if="windows"/>
  <lib name="shell32.lib" if="windows"/>
  <lib name="-lgtk+2" if="linux"/>
  <lib name="-lgconf-2.0" if="linux"/>
  <vflag name="-framework" value="IOKit" if="macos"/>
  <vflag name="-framework" value="Foundation" if="macos"/>
  <vflag name="-framework" value="Carbon" if="macos"/>
  <outdir name="../ndll/${BINDIR}"/>
</target>

<target id="default"> <target id="systools" /> </target>
</xml>

3 haxe端

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注