我使用SWIG为我不拥有的C ++库创建C#包装器。
我遇到问题的唯一功能如下:
int getStringWrapper(..., StringWrapperClass& parameter);
如果有帮助,StringWrapperClass不归我所有,但看起来与this question中提到的StringPtr类非常相似。链接的问题与std::string
有关,但我认为我的问题更为笼统。
如何为一个对类类型进行非常量引用的方法编写SWIG类型映射(对于C#)?
SWIG正在产生:
SWIGEXPORT int SWIGSTDCALL CSharp_getStringWrapper(..., void * jarg3) {
int jresult ;
...
StringWrapperClass *arg3 = 0 ;
int result;
...
arg3 = (StringWrapperClass *)jarg3;
if (!arg3) {
SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "StringWrapperClass & type is null", 0);
return 0;
}
result = (int)getStringWrapper(...,*arg3);
jresult = result;
return jresult;
}
但是我在调用getStringWrapper的行中遇到了受保护的内存访问错误。
我不擅长C ++ ......据我所知,SWIG正在使用指针StringWrapperClass*
,但它需要一个引用,这是导致问题的原因?
我成功地包装了其他具有签名的方法:
int getStringWrapper(..., StringWrapperClass*& parameter);
在这种情况下,SWIG生成的代码与上面的类似,但是:
arg3 = (StringWrapperClass**)jarg3;
我看过this question,看起来非常像我想要实现的目标,除了我需要在C#中使用它。前面提到的linked question似乎也提供了一个解决方案。我已经尝试按照这些方式编写自己的C#类型图,因为我们之前没有知道如何替换C#的所有jenv,JCALL1内容。
还有this answer,但我真的不明白我现在的目标。
请允许对SWIG和C ++有更多了解的人比我指出正确的方向吗?