2017-10-25 14 views
1

これは簡単な問題だと思っていましたが、回答を見つけるのが難しかったです。SWIG - Java Proxy Class Arrayパラメータ

私はC++で定義された構造体を持っている、のは言わせて:

struct MyStruct 
{ 
    int a; 
    int b; 
}; 

これはSWIGでJavaプロキシクラスMyStructに包まれます。私はCで機能を有する++ struct MyStructの配列をとる:

void myFunction(struct MyStruct arg[], int amount); 

SWIGはポインタパラメータを見て、したがって、そのパラメータとして単一MyStructオブジェクトを使用する機能のJavaラッパーを生成する:

void myFunction(MyStruct arg, int amount) { /**/ } 

SWIGにMyStruct Javaオブジェクトの配列を取るJava関数を生成させるにはどうすればよいですか?私はプリミティブ型の配列のためにそれを理解することができましたが、それをカスタムラップ型のために働かせる方法を見つけていません。

だから私の希望のJava関数のシグネチャは、このようになります:

void myFunction(MyStruct[] arg, int amount); 

編集:プロキシクラスの適切なSWIGの命名法を使用するように更新文言。

+0

これは実際に可変機能ですか? – Flexo

+0

@Flexoいいえ、申し訳ありませんが、私の構文がどのように混乱するか考えなかった:P私の答えを編集して明確にしました。 –

+0

あなたのC++は配列の長さをどのように知っていますか?それは修正されていますか?または魔法の最終値?または省略された引数の1つ? (私が得意とするのは、実際には動作しますが、最小限の例では、必要なものを正確に理解することが容易になるということです) – Flexo

答えて

0

%array_classからcarrays.iを使用して生成された中間配列クラスを使用して、injavainのタイプマップと一緒に動作するソリューションを作成できました。ソリューションの完全な実例は私のgistにあります。

誰かがより良い解決策や改善を考え出すことができれば、私は非常に感謝しています。私のソリューションの欠点は、この方法で使用したい異なるプロキシクラスごとに追加のJava配列プロキシクラスを作成する必要があり、Java APIが乱雑になる可能性があることです。これは、javaclassmodifiersタイプマップを使用して、アレイプロキシクラスpackage-privateをわずかに改善することで改善できます。