Отправка значений в C # обернутая C ++ DLL вызывает сбой Unity - PullRequest
4 голосов
/ 28 декабря 2011

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

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

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

Все в порядке, и я попытался Debug.Log (k), чтобы проверить возвращаемое значение k, и кажется, что работает правильно. Поэтому я думаю Я могу вызывать функции и получать возвращаемые значения .

Но когда я попытаюсь это сделать, Unity вылетит:

g.AddNode(num_of_nodes);

Кажется , он будет зависать всякий раз, когда я пытаюсь отправить значения . Понятия не имею, почему это происходит.


Я хочу обернуть класс Библиотека MaxFlow Юрия Бойкова и Владимира Колмогорова . Кто-нибудь знает, как использовать эту библиотеку в 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;
}

1 Ответ

0 голосов
/ 12 марта 2014

Может быть, не тот ответ, который вы ищете, но лучшее, что я могу придумать, основываясь на этом вопросе.

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

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 .

...