Table of Contents
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.xml
或 lime 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); } }