2012-05-02 11 views
3

HaxeのC++ターゲットでNeko dll(C++で書かれています)を使用しようとしています。私はhaxeの関数を呼び出すことはできますが、値を渡すことはできません。関数がパラメータを取らない場合にのみ、それが実行さHaxe C++ターゲットのNeko Dlls

class Main 
{ 
    var load = cpp.Lib.loadLazy("ndll" , "Hello", 1); 
    static function main() 
    { 
      load(1); 
    } 
} 

-

value Hello(value h) 
{ 
    cout << val_int(h); 
    return val_int(1); 
}DEFINE_PRIM(Hello, 1); 

これは、haXeのコードです -

これは、C++のコードです。また、C++関数からHaxeに返される値はnullです。

このコードはnekoターゲット用にコンパイルすると実際は完全に動作しますが、cppターゲットでは動作しません。

何か助けていただければ幸いです。

答えて

1

これが機能するためには、あなたがあなたのCPPファイルのヘッダに追加する必要があります:(代わりに猫のヘッダの)

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

を あなたはndllは、両方の猫上で実行する場合とhxcppの前に、

#define NEKO_COMPATIBLE 

を追加する必要があります。

あなたにとって最適なものを使ってコンパイルすることができますが、hxcppのヘッダにincludeとlibのパスを自動的に追加するので、Build.xmlを使ってndllを生成することをお勧めします。あなたがここに非常に単純なのbuild.xmlの例を見ることができます: http://pastebin.com/X9rFraYp

あなたがここにhxcppのCFFI詳細マニュアルを参照してくださいすることができます:http://haxe.org/doc/cpp/ffi

+0

感謝:

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

いくつかの便利なリンク:

はここで参照としてコードのhaXeの部分です回答。しかし、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の助けを借りて行われます。用

+0

cool。これは私が探していたものです。あなたはワネックが与えたものの拡大された形を与えました。ありがとう – carboncopy

+0

すばらしい答え! :) – Waneck

関連する問題