2011-12-28 1 views
4

У меня есть класс C++, который я хочу использовать в Unity (C#), поэтому я скомпилировал dll C++ и создал для него dll-оболочку C#. Я сделал это с помощью SWIG.Отправка значений на C# завернутый C++ dll вызывает Unity crash

Когда я делаю это:

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

Это нормально, и я попытался 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 grnerated CS-файл, функция AddNode:

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

Возможно, не answ вы ищете, но лучшее, что я могу придумать, основано на вопросе.

Я бы начал с более простого примера и отработал оттуда. Например, начните с изменения вашей функции, чтобы ничего не делать, кроме возврата, например:

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.

Смежные вопросы