将值发送到包装的C++ dll的C#代码会导致Unity崩溃

4

我有一个C++类,希望在Unity(C#)中使用它,因此我编译了一个C++ dll,并为其创建了一个C#包装器dll。我使用SWIG完成了这个过程。

当我这样做时:

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

没问题,我尝试使用Debug.Log(k)来检查返回的k值,它似乎工作正常。所以我认为我可以调用函数并获取返回值

但当我尝试这样做时,Unity会崩溃:

g.AddNode(num_of_nodes);

看起来每当我尝试发送值时它就会崩溃。不知道为什么会这样。


我想要包装的类是Yuri Boykov和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函数:

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
也许不是你想要的答案,但根据问题,这是我能想到的最好的答案。
我建议从一个更简单的例子开始,并逐步加强。例如,可以先修改函数仅返回空值,像这样:
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进行调试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接