2013-05-11 54 views
4

我很難讓SWIG typemap(javapackage)正常工作。我試着製作一個簡單的問題版本,甚至似乎失敗了。SWIG將不同模塊和包中生成的類導入當前類

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 

Foo.i

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

文件被正確生成,但發現有是沒有導入語句,所以Foo找不到任何Bar Java類。這是一個簡單的例子,但只是對導入語句進行硬編碼並不適合我,因爲生成的包含C JNI代碼的源文件可能具有「Foo」類文件的錯誤位置。

這似乎是一個非常簡單和常見的問題,所以,我想知道的是,如果我失去了一些東西,或者如果我做錯了什麼。

感謝您的幫助!

回答

4

得到了同樣的問題,並找到答案,所以張貼它的社區。

您需要進行3項更改。

  1. 添加import語句生成的代理類(Bar.java):

    // Bar.i 
    %pragma(java) jniclassimports=%{ 
    import com.me.t.foo.Foo; 
    %} 
    
  2. 添加import語句生成的JNI包裝類(BarModJNI。JAVA):

    // Bar.i 
    %typemap(javaimports) Bar %{ 
    import com.me.t.foo.Foo; 
    %} 
    
  3. 泰爾夜風使Foo.getCPtr公共成員變量,因爲酒吧類將要訪問它:

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

參考:

0

只是對Zbigniew提供的答案發表了一些評論。我遇到了這篇文章中描述的同樣的問題。我想澄清兩點。

首先,在我看來,第1步是在JNI包裝類(whateverJNI.java)中添加導入,而第2步是將導入添加到特定類。

其次,第2步不適合我,而不是%typemap(javaimports) <class>我不得不使用%typemap(javaimports) SWIGTYPE。不好的一點是它會將導入添加到所有生成的Java類中,而不僅僅是添加到所需的類。

最後,包裝的具體類型時,我仍然具有痛飲不承認進口類的問題,它仍然使用SWIGTYPE_<type>,而不是直接<type>

相關問題