4

SWIG typemap(javapackage)を正しく動作させるのに苦労しています。問題の簡単なバージョンを作成しようとしましたが、それでも失敗するようです。

foo.h:

#ifndef FOO_H
#define FOO_H

class Foo
{
public:
    Foo() {};
    int doSomething() { return 1 };
};

#endif

bar.h:

#ifndef BAR_H
#define BAR_H

#include "foo.h"

class Bar
{
public:
    Bar() {};
    int doSomething(Foo foo) { return foo.doSomething(); };
};

#endif

フーアイ

%module FooMod

%include "typemaps.i"
%include "stdint.i"

%{
#include "../header/foo.h"
%}

%include "../header/foo.h"

Bar.i

%module BarMod

%import "Foo.i"

%typemap("javapackage") Foo, Foo *, Foo & "com.me.t.foo";

%include "typemaps.i"
%include "stdint.i"

%{
#include "../header/bar.h"
%}

%include "../header/bar.h"

これらを次のコマンドで実行します。

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);
}

ファイルは適切に生成されますが、import ステートメントがないことに注意してください。そのため、どちらの Bar Java クラスからもFooを見つけることができません。これは単純な例ですが、C JNI コードを含む生成されたソース ファイルの「Foo」クラス ファイルの場所が間違っている可能性があるため、インポート ステートメントをハードコーディングするだけでは解決できません。

これは非常に単純で一般的な問題のように思えるので、私が疑問に思っているのは、何かが足りないのか、何か間違っているのかということです。

助けてくれてありがとう!

4

3 に答える 3

4

同じ問題を抱えて答えが見つかったので、コミュニティに投稿してください。

3 つの変更を行う必要があります。

  1. 生成されたプロキシ クラス (Bar.java) にインポート ステートメントを追加します。

    // Bar.i
    %pragma(java) jniclassimports=%{
    import com.me.t.foo.Foo;
    %}
    
  2. 生成された JNI ラッパー クラス (BarModJNI.java) にインポート ステートメントを追加します。

    // Bar.i
    %typemap(javaimports) Bar %{
    import com.me.t.foo.Foo;
    %}
    
  3. Foo.getCPtrBar クラスがそれにアクセスする必要があるため、SWIG に public メンバー変数を作成するように指示します。

    // Foo.i
    SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
    SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

参照:

于 2014-02-17T08:21:01.703 に答える
1

Zbigniew から提供された回答に対するコメントがいくつかあります。この投稿で説明されているのと同じ問題に直面しました。二つの点を明確にしたい。

まず、ステップ1はJNIラッパークラス(whateverJNI.java)にインポートを追加するためのものであり、ステップ2は特定のクラスにインポートを追加するためのものです。

次に、ステップ 2 が機能しませ%typemap(javaimports) <class>%typemap(javaimports) SWIGTYPE。悪いことは、必要なクラスだけでなく、生成されたすべての Java クラスにインポートを追加することです。

SWIGTYPE_<type>最後に、特定のタイプをラップするときにSWIGがインポートされたクラスを認識せず、直接ではなく使用するという問題がまだあります<type>

于 2015-09-29T07:42:56.063 に答える