2017-07-17 109 views
1

我正在使用SWIG爲我的一個C庫生成Java綁定。但是我在處理C指針時遇到了麻煩。下面是一些代碼來證明我的問題:SWIG:如何處理生成的Java代碼中的指針

calc.h文件:

extern int sum(int a, int b); 
extern int sum_1(int *a, int *b); 

calc.c文件:

#include "calc.h" 

int sum(int a, int b) { 
    return a + b; 
} 

int sum_1(int *a, int *b) { 
    return *a + *b; 
} 

calc.i文件:

%module calc 
%{ 
#include "calc.h" 
%} 

%include "calc.h" 

我用下面的命令生成Java綁定荷蘭國際集團代碼:

gcc -c calc.c 
swig -java calc.i 
gcc -fpic -c calc_wrap.c -I/usr/lib/jvm/java-1.8.0/include -I/usr/lib/jvm/java-1.8.0/include/linux 
ld -G calc_wrap.o calc.o -o libcalc.so 

現在對於我的主要FUNC:

public class Application { 
    static { 
    System.loadLibrary("calc"); 
    } 

    public static void main(String[] args) { 
    System.out.println(calc.sum(1, 2)); 
    // System.out.println(calc.sum_1(?, ?)); 
    } 
} 

上面的代碼通常會編譯&運行並打印出3預期。問題是,如何使用calc.sum_1 func?我完全不知道如何處理int *類型。

FYI,通過附SWIG產生一些代碼:

calc.java文件:

public class calc { 
    public static int sum(int a, int b) { 
    return calcJNI.sum(a, b); 
    } 

    public static int sum_1(SWIGTYPE_p_int a, SWIGTYPE_p_int b) { 
    return calcJNI.sum_1(SWIGTYPE_p_int.getCPtr(a), SWIGTYPE_p_int.getCPtr(b)); 
    } 

} 

calcJNI.java文件:

public class calcJNI { 
    public final static native int sum(int jarg1, int jarg2); 
    public final static native int sum_1(long jarg1, long jarg2); 
} 

SWIGTYPE_p_int.java文件:

public class SWIGTYPE_p_int { 
    private transient long swigCPtr; 

    protected SWIGTYPE_p_int(long cPtr, @SuppressWarnings("unused") boolean futureUse) { 
    swigCPtr = cPtr; 
    } 

    protected SWIGTYPE_p_int() { 
    swigCPtr = 0; 
    } 

    protected static long getCPtr(SWIGTYPE_p_int obj) { 
    return (obj == null) ? 0 : obj.swigCPtr; 
    } 
} 

非常感謝您的幫助!

回答

3

痛飲不產生方式默認創建的指針,但也有在這裏描述的幾種方法:http://web.mit.edu/svn/src/swig-1.3.25/Examples/java/pointer/index.html

例如,將其添加到接口文件的底部:

%include cpointer.i 
%pointer_functions(int, intp); 

其產生一組效用函數以創建SWIGTYPE_p_int

SWIGTYPE_p_int p1 = calc.new_intp(); 
SWIGTYPE_p_int p2 = calc.new_intp(); 
calc.intp_assign(p1, 1); 
calc.intp_assign(p2, 2); 

System.out.println(calc.sum_1(p1, p2)); 

calc.delete_intp(p1); 
calc.delete_intp(p2); 
相關問題