2012-02-18 4 views
1

私は、バイト配列(File..etcを表すバイナリデータ)または文字配列へのポインタのどちらかのunsigned char *を返すC関数を持っています。私は現在、署名されていないcharポインタを返すすべてのC関数をラップするSWIG %array_classを使用しており、Java側での人口と検索を処理するJava配列ユーティリティ(SampleArrayUtil.java)を作成しています。SWIGでバイト配列データをラップするarray_class

私の問題は、unsigned char *を使ってラップすることです:%apply char * { unsigned char * };私はJava側でStringの配列を取得します。私はバイナリデータを取得するときにを使用してunsigned char *の戻り値をラップしたくないので、Java側でバイト配列を取得したいだけです。私は、バイナリデータを扱うために別のC関数を作成することを考えていましたが、私はそれがまたunsigned char *getValueFromRowAsByteArrayを参照)

C関数の戻りますよう、この新しい機能をラップするかどうかはわからないよ:

unsigned char * getValueFromRowAsStringArray(struct result_row *row, attribute_type type, int32_t *len) 

unsigned char * getValueFromRowAsByteArray(struct result_row *row, attribute_type type, int32_t *len) 
//*row* input param with data results, *type* input enum type for the data type being requested and *len* is an output param that contains the length of the data being returned. 
+0

JavaインターフェイスでCタイプの同じタイプから返されるタイプが異なる - タイプマップを選択的に適用したいと思っていますか? (答えを書く前に私たちが同じページをチェックしている) – Flexo

+0

@awoodland - そうです。 – c12

答えて

2

%module Sample 
%include "typemaps.i" 
%include "stdint.i" 
%include "arrays_java.i" 
%include "carrays.i" 
%array_class(unsigned char, SampleArrayUtil); 
%{ 
#include "C_API.h" 
%} 
%apply char * { unsigned char * }; 
%include "C_API.h" 
あなたは異なったタイプのマップを適用することができます:unsigned char型*を返す(charの配列を)C関数をラップするための

SWIGインタフェースファイル少なくとも2つの方法で異なる場所で同じタイプにすることができます。

まずあなたが例えば、%applyまたは%clearでアクティブタイプマップを変更することができます。:

%module test 

%include "stdint.i" 

%apply intptr_t { unsigned char * }; 
unsigned char * test1(); 

%apply char * { unsigned char * }; 
unsigned char * test2(); 

%clear unsigned char *; 
unsigned char * test3(); 

はアクティブタイプマップによると、別の戻り値の型とJavaで3つの機能を提供します。

第二に、あなたはまた、例えば、しかし、より具体的なタイプマップを書くことができます:

%apply long long { unsigned char * test4 }; 
%apply char * { unsigned char * test5 }; 
unsigned char * test4(); 
unsigned char * test5(); 

のみ、それぞれtest4test5に適用されます - それは、型と関数名に一致します。あなたは同様に関数のシグネチャを入力し、パラメータ名に一致させることができる引数について

public static long test4() { 
    return testJNI.test4(); 
    } 

    public static String test5() { 
    return testJNI.test5(); 
    } 

:Javaでは、これはになります。

関連する問題