Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWIG从其他模块导入生成的类并将包导入当前类_Java_C++_C_Swig - Fatal编程技术网

Java SWIG从其他模块导入生成的类并将包导入当前类

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

我很难让水龙头正常工作。我试着对这个问题做一个简单的解释,但似乎都失败了

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 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个改变

  • 将导入语句添加到生成的代理类(Bar.java):

  • 将导入语句添加到生成的JNI包装类(BarModJNI.java):

  • 告诉SWIG使
    Foo.getCPtr
    成为公共成员变量,因为Bar类将要访问它:

    // Foo.i
    SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
    SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    
  • 参考:


    仅就兹比格涅夫提供的答案发表几点评论。我也遇到了这篇文章中描述的同样的问题。我想澄清两点

    首先,在我看来,第1步是在JNI包装类(whateverJNI.java)中添加导入,而第2步是在特定类中添加导入

    其次,步骤2对我不起作用,我不得不使用
    %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