3

HaxeのC++ターゲットでNekodll(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);
     }
 }

関数がパラメータを受け取らない場合にのみ実行されます。また、C++関数からHaxeに返される値はですnull

このコードは、nekoターゲット用にコンパイルすると実際には完全に機能しますが、cppターゲットでは機能しないようです。

どんな助けでも大歓迎です。

4

2 に答える 2

8

完全に修正された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_intvalueをネイティブCタイプに変換するために使用されるため、印刷コードは正しいものでした。しかし、あなたのリターンは間違っていました:関数があなたがHaxeintに戻ることを期待しているとき、あなたはCタイプを返すことができません。value新しいHaxeIntタイプを作成して返す必要があります。これはの助けを借りて行われalloc_intます。

参照としてのコードのHaxe部分は次のとおりです。

class Main
{
    static var hello = cpp.Lib.load("myLib", "hello", 1);

    static function main()
    {
        var myReturnedInt:Int = hello(1);
    }
}

いくつかの役立つリンク:

于 2012-05-03T07:30:53.703 に答える
1

これを機能させるには、cppファイルのヘッダーに次のものを追加する必要があります。

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

(nekoのヘッダーの代わりに)ndllをnekoと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で確認できます

于 2012-05-03T00:42:53.903 に答える