2012-05-02 50 views
3

我想用Haxe的C++目標使用Neko dll(用C++編寫)。我能夠在haxe中調用函數,但無法傳遞值。Neko Dll在Haxe C++目標

這是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目標一起工作。

任何幫助表示讚賞。

回答

1

爲了這個工作,你必須添加到您的CPP文件的標題:

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

(而不是貓的頭部) 如果你想在ndll到兩個ネ運行, hxcpp,您還應該添加

#define NEKO_COMPATIBLE 

包含hx/CFFI.h之前。

你可以使用任何最適合你的方式進行編譯,但我建議使用Build.xml生成你的ndll,因爲它會自動爲hxcpp的頭文件添加include和lib路徑。這裏你可以看到一個很簡單的build.xml的例子: http://pastebin.com/X9rFraYp

你可以看到關於hxcpp的CFFI這裏更多的文檔:http://haxe.org/doc/cpp/ffi

+0

謝謝了回答。但是,你能否解釋一下如何使用build.xml進行編譯。 – carboncopy

+0

Build.xml引用目前有點稀疏。你可以在[NME](http://www.haxenme.org/)項目中找到一些例子。要使用Build.xml文件進行編譯,請使用'haxelib run hxcpp Build.xml'。 – Chman

7

這裏是完全糾正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類型,因此您的打印代碼是正確的。但是你的回報是錯誤的:當函數期望你返回一個value給Haxe時,你不能返回一個類型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); 
    } 
} 

一些有用的鏈接:

+0

很酷。這是我正在尋找的。你已經給出了瓦內克給出的擴展形式。謝謝 – carboncopy

+0

很好的答案! :) – Waneck