2011-12-28 10 views
4

Unity(C#)で使用したいC++クラスがあるので、C++ dllをコンパイルしてC#ラッパーdllを作成します。私はSWIGを使ってこれを行った。C#に値を送信するとC++のdll原因Unityクラッシュが発生する

私が行うと、この:

Graph g = new Graph(); 
int k = g.AddNode(); 

それは結構です、と私は返されたk値をチェックするためにDEBUG.LOG(k)を試してみましたし、それが正しく動作ようです。だから私は私は関数を呼び出して、戻り値を得ることができると思います。

しかし、私はこれを行うにしようとすると、Unityがクラッシュします:

g.AddNode(num_of_nodes); 

は、私は値を送信しようとするたびに、それがクラッシュしますようです。なぜこれが起こっているのか分かりません。


ラップしたいクラスはMaxFlow library of Yuri Boykov and Vladimir Kolmogorovです。誰でも、このライブラリをUnityでどのように使用するかについては、何か助けてください。


オリジナルC++ add_node()関数:生成

int Graph::add_node(int num) 
{ 
    //assert(num > 0); 

    if (node_last + num > node_max) reallocate_nodes(num); 

    if (num == 1) 
    { 
     node_last -> first = NULL; 
     node_last -> tr_cap = 0; 
     node_last -> is_marked = 0; 
     node_last -> is_in_changed_list = 0; 

     node_last ++; 
     return node_num ++; 
    } 
    else 
    { 
     memset(node_last, 0, num*sizeof(node)); 

     int i = node_num; 
     node_num += num; 
     node_last += num; 
     return i; 
    } 
} 

SWIG * _wrap.cxx、た。AddNodeの機能:

//with send param (g.AddNode(num_of_nodes)), this one will crash 
SWIGEXPORT int SWIGSTDCALL CSharp_Graph_add_node__SWIG_0(void * jarg1, int jarg2) { 
    int jresult ; 
    MaxFlowGraph::Graph *arg1 = (MaxFlowGraph::Graph *) 0 ; 
    int arg2 ; 
    MaxFlowGraph::Graph::int result; 

    arg1 = (MaxFlowGraph::Graph *)jarg1; 
    arg2 = (int)jarg2; 
    result = (arg1)->add_node(arg2); 
    jresult = result; 
    return jresult; 
} 

//without send param (g.AddNode()), this one works 
SWIGEXPORT int SWIGSTDCALL CSharp_Graph_add_node__SWIG_1(void * jarg1) { 
    int jresult ; 
    MaxFlowGraph::Graph *arg1 = (MaxFlowGraph::Graph *) 0 ; 
    MaxFlowGraph::Graph::int result; 

    arg1 = (MaxFlowGraph::Graph *)jarg1; 
    result = (arg1)->add_node(); 
    jresult = result; 
    return jresult; 
} 

SWIGは、CSファイルた。AddNodeの機能をgrnerated

public int AddNode(int num) 
{ 
    int ret = MaxFlowGraphPINVOKE.Graph_add_node__SWIG_0(swigCPtr, num); 
    return ret; 
} 

public int AddNode() 
{ 
    int ret = MaxFlowGraphPINVOKE.Graph_add_node__SWIG_1(swigCPtr); 
    return ret; 
} 

答えて

0

多分答えはありませんあなたが探している、しかし最高の私は質問に基づいて思い付くことができます。

私はより簡単な例から始めてそこから作業します。たとえば、次のように関数を変更することから始めます。

int Graph::add_node(int num) 
{ 
    return 1; 
} 

それでもクラッシュしますか?その場合、問題は関数内になく、ラッパー・コード内にある可能性があります。おそらく何もしないようにラッパーコードを変更することもできます:

SWIGEXPORT int SWIGSTDCALL CSharp_Graph_add_node__SWIG_0(void * jarg1, int jarg2) { 
    return 1; 
} 

それでもクラッシュしますか?もしそうなら、おそらく減速の問題か、またはコンパイラ設定の誤り(呼び出し規約、32ビットと64ビット、互換性のないライブラリや外部依存関係など)が間違っている可能性があります。

上記の最初のコードでクラッシュが修正された場合、おそらくmemset()の疑いがあるようなコードのバグがあります - もう一度クラッシュするまで関数にコードを追加し始めますクラッシュが起こっている場所を正確に把握することができます。

これはすべてデバッガでステップ実行できないことを前提としています。これを行うことができれば、最初にこの質問をしないと仮定します。あなたが上記のテストの結果のような詳細を提供すれば、より多くのことを助けようとします。

編集:クラッシュする前にC++コードを取得した場合、OutputDebugStringを使用してデバッグを試みることができます。

関連する問題