我正在使用SWIG生成Java类,我有3个不同的类,一个依赖于其他类。 SWIG指向这些类,因为它不知道它,我需要SWIG使用创建的Java类而不是SWIG创建的指针。
我该怎么做?
我有这样的c ++函数:
bool foo(class1& parm);
现在我使用SWIG在Java中创建class1
,我想让SWIG使用它创建的参数foo
将class1
包装在Java中,而不是SWIG_P_class1
。我没有办法做到这一点。
答案 0 :(得分:0)
Swig隐藏了所使用的实际类或对象之类的细节。如果你想访问真正的Java对象和类,我建议你使用JNI(它可以让你访问所有东西并且可能更快)
答案 1 :(得分:0)
对于SWIG一无所知的类型(即,除了前向声明之外还没有看到任何内容),它可以生成的最佳包装器大致反映了在C ++中使用前向声明的类可以做什么 - 它被包装成行为的东西像一个不透明的指针。这是您看到的SWIG_P_class1
。你可以用这个来做明智的事,例如如果你有一个返回引用或指向实例的指针的方法,你可以调用它来将对象传递给foo
。
但是你可能不想在实际接口中使用那么多,所以给定一个头文件我们想要包装它看起来像:
class class1;
bool foo(class1& parm);
您可以通过向SWIG提供class1
的部分(或完整,如果您愿意)定义来明智地包装它,例如:
%module test
class class1 {
};
%include "test.hh"
将导致合理的class1
和foo
在Java端公开,因此您可以在Java中使用它们,如下所示:
test.foo(new class1());
完全按照你的意愿。
您当然需要为生成的C ++提供class1
类的足够知识,就像使用任何其他C ++代码一样。最简单的方法是使SWIG界面看起来像:
%module test
%{
#include "class1_defined_here.hh"
%}
class class1 {
};
%include "test.hh"