gpt4 book ai didi

c++ - 将值发送到 C# 包装的 C++ dll 导致 Unity 崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:15 26 4
gpt4 key购买 nike

我有一个要在 Unity(C#) 中使用的 C++ 类,因此我编译了一个 C++ dll 并为其创建了一个 C# 包装器 dll。我使用 SWIG 做到了这一点。

当我这样做时:

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

很好,我尝试使用 Debug.Log(k) 检查返回的 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函数:

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;
}

最佳答案

也许不是您正在寻找的答案,但我可以根据问题得出最好的答案。

我会从一个更简单的例子开始,然后从那里开始。例如,首先将您的函数修改为只返回,如下所示:

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 进行调试。 .

关于c++ - 将值发送到 C# 包装的 C++ dll 导致 Unity 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com