我使用SWIG生成Java类,我有3个不同的类,其中一个依赖于其他类。SWIG使指针指向这个类,因为它不知道它,我需要SWIG使用创建的Java类,而不是SWIG创建的指针。
我该怎么做呢?
我有这样的c++函数:
bool foo(class1& parm);现在我使用SWIG在Java语言中创建class1,我想让SWIG使用它创建的参数class1而不是SWIG_P_class1来包装Java语言中的foo。我没有办法做到这一点。
发布于 2012-01-10 16:23:22
Swig隐藏了一些细节,比如实际使用的类或对象。如果你想访问真正的Java对象和类,我建议你使用JNI (它让你可以访问所有东西,而且可能会更快)
发布于 2012-01-12 05:58:01
对于SWIG一无所知的类型(也就是说,除了转发声明之外什么都没见过),它能生成的最好的包装器大致反映了你可以用C++中的转发声明类所做的事情--它被包装成一个行为类似于不透明指针的东西。这就是您看到的SWIG_P_class1。你可以用它做一些明智的事情,例如,如果你有一个方法返回实例的引用或指针,你可以调用它来获得一个对象来传递给foo。
然而,你可能不想在实际的接口中使用那么多,所以给出一个我们想要包装的头文件,如下所示:
class class1;
bool foo(class1& parm);您可以通过为SWIG提供class1的部分定义(如果您愿意,也可以是完整的定义)来合理地包装它,例如:
%module test
class class1 {
};
%include "test.hh"将导致在Java端公开一个合理的class1和foo,因此您可以在Java端使用它们,如下所示:
test.foo(new class1());正如你所希望的那样。
当然,您需要为生成的C++提供足够的class1类知识,就像处理任何其他C++代码一样。最简单的方法是让你的SWIG界面看起来像这样:
%module test
%{
#include "class1_defined_here.hh"
%}
class class1 {
};
%include "test.hh"https://stackoverflow.com/questions/8800232
复制相似问题