Java SWIG从其他模块导入生成的类并将包导入当前类
我很难让水龙头正常工作。我试着对这个问题做一个简单的解释,但似乎都失败了 foo.h:Java SWIG从其他模块导入生成的类并将包导入当前类,java,c++,c,swig,Java,C++,C,Swig,我很难让水龙头正常工作。我试着对这个问题做一个简单的解释,但似乎都失败了 foo.h: #ifndef FOO_H #define FOO_H class Foo { public: Foo() {}; int doSomething() { return 1 }; }; #endif B.h: #ifndef BAR_H #define BAR_H #include "foo.h" class Bar { public: Bar() {}; int d
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo() {};
int doSomething() { return 1 };
};
#endif
B.h:
#ifndef BAR_H
#define BAR_H
#include "foo.h"
class Bar
{
public:
Bar() {};
int doSomething(Foo foo) { return foo.doSomething(); };
};
#endif
福伊
酒吧,我
使用以下命令运行这些命令:
swig -c++ -java -package com.me.t.foo -outdir ../../src/com/me/t/foo -o ../src/Foo.cpp Foo.i
swig -c++ -java -package com.me.t.bar -outdir ../../src/com/me/t/bar -o ../src/Bar.cpp Bar.i
我得到这个输出:
package com.me.t.bar;
public class Bar {
private long swigCPtr;
protected boolean swigCMemOwn;
protected Bar(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
protected static long getCPtr(Bar obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
BarModJNI.delete_Bar(swigCPtr);
}
swigCPtr = 0;
}
}
public Bar() {
this(BarModJNI.new_Bar(), true);
}
public int doSomething(Foo foo) {
return BarModJNI.Bar_doSomething(swigCPtr, this, Foo.getCPtr(foo), foo);
}
}
BarModJNI.java:
package com.me.t.bar;
public class BarModJNI {
public final static native long new_Bar();
public final static native int Bar_doSomething(long jarg1, Bar jarg1_, long jarg2, Foo jarg2_);
public final static native long Bar_getFoo(long jarg1, Bar jarg1_);
public final static native void delete_Bar(long jarg1);
}
// Bar.i
%typemap(javaimports) Bar %{
import com.me.t.foo.Foo;
%}
文件是正确生成的,但是请注意,没有import语句,因此无法从任何一个Bar Java类中找到Foo。这是一个简单的示例,但我不选择硬编码导入语句,因为生成的包含C JNI代码的源文件可能具有错误的“Foo”类文件位置
这似乎是一个非常简单和常见的问题,所以,我想知道的是我是否遗漏了什么,或者我是否做错了什么
谢谢你的帮助 得到了同样的问题并找到了答案,所以将其发布到社区 你需要做3个改变
Foo.getCPtr
成为公共成员变量,因为Bar类将要访问它:
// Foo.i
SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
%typemap(javaimports)
而不是%typemap(javaimports)SWIGTYPE
。糟糕的是,它将导入添加到所有生成的java类中,而不仅仅是添加到所需的类中
最后,我仍然有一个问题,SWIG在包装特定类型时无法识别导入的类,并且它仍然使用
SWIGTYPE\uu
,而不是直接使用
,我遇到了同样的问题。
我通过编写来解决(您需要在.I文件中编写)
此代码仅生成指定类的导入语句。
注意:必须指定本机命名空间,否则将看不到您的类
例如: 如果你的C++代码是这样的:
namespace A{
class MyPerfectClass{
};
}
你需要写作
%typemap(javaimports) A::MyPerfectClass
%{
import com.yourcompany.yourapp.*;
%}
%typemap(javaimports) SWIGTYPE
%{
import com.yourcompany.yourapp.*;
%}
如果要将此导入语句添加到所有java包装的类中,则需要编写
%typemap(javaimports) A::MyPerfectClass
%{
import com.yourcompany.yourapp.*;
%}
%typemap(javaimports) SWIGTYPE
%{
import com.yourcompany.yourapp.*;
%}
对于JNI Java类:
%pragma(java) jniclassimports=%{
import com.yourcompany.yourapp.*;
%}
证明代码如下:
package com.mycompany.myproject.A_package;
import com.mycompany.myproject.B_package.*;
public class MYCLASS{
private transient long swigCPtr;
protected transient boolean swigCMemOwn;
public MYCLASS(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
public static long getCPtr(MYCLASSobj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
.
. etc.
如果您有多个类,则可以继续,如下所示:
%typemap(javaimports) A::MyPerfectClass , A::B::MyFantasticClass , MyNoNamespaceClass
我已经用SWIG 4.0进行了测试,它可以正常工作。我更改了验证码上的包和类名,因为我无法共享我的公司和类名。我希望这个答案会对其他有同样问题的人有所帮助
package com.mycompany.myproject.A_package;
import com.mycompany.myproject.B_package.*;
public class MYCLASS{
private transient long swigCPtr;
protected transient boolean swigCMemOwn;
public MYCLASS(long cPtr, boolean cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = cPtr;
}
public static long getCPtr(MYCLASSobj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
.
. etc.
%typemap(javaimports) A::MyPerfectClass , A::B::MyFantasticClass , MyNoNamespaceClass