Javaで使用するには、C++ライブラリをSWIGでラップする必要があります。
私はすでにいくつかの方法が機能していますが、それを解決する方法がわからないという状況に遭遇しました。
私はこのようないくつかの方法があります:
void method1(std::string & name, std::string & result);
bool method2(std::string & name, std::string & alias, std::string & resurnValue, std::string & returnType);
注:実際には、これはMyClassという名前のクラスのメンバーメソッドです。
std::string
最初のメソッドを変更して、の代わりにを返すことができvoid
ます。これでうまくいくはずです。しかし、最後の2つのパラメーターが出力パラメーターである2番目のメソッドを処理する方法がわかりません。char *
出力パラメータ(複数のパラメータを渡し、Swig / Pythonを使用してCで文字列を割り当てる)を参照するいくつかの質問を見てきましたが、私の場合はaである必要がありstd::string
、SWIGのドキュメントにはこの状況が記載されていません。ここにリンクの説明を入力してください。また、おそらく異なるタイプの3つ以上の出力パラメーターを返すメソッドに遭遇する可能性があります。
最後に、インターフェイスについて少し制御できます。ライブラリへのエントリポイントとして機能するクラスも開発していますが、実際の実装に呼び出しを渡すだけです。
たとえば、これによって私はなんとかのようなメソッドを変更するmethod3(std::string & s)
ことmethod3(const std::string & s)
ができたので、通常の。でJavaからそれを使用することができましたString
。
したがって、メソッドの署名を少し変更することは可能ですが、ネイティブメソッドがn個の出力パラメーターを返す場合は、それらすべてを返す必要があります(それぞれを返す新しいメソッドを作成することはできません)。
更新: 私はFlexoによって提供されたソリューションを検討しており、うまく機能していますが、std :: stringをラップするクラスを実行し、それを使用して返された文字列を操作することを検討しています。これは、Flexoの2番目のソリューションと非常によく似たアプローチです。 、ただし、Java文字列配列を使用する代わりにこのStringWrapperを使用すると、基本的に次のようになります。
/*
* The MyClass.i file
*/
%module example
%include "std_string.i"
%{
class StringPtr{
private:
stdString str;
public:
StringPtr(){
}
StringPtr(const stdString & str){
this->str = stdString(str);
}
stdString & getStrRef(){
return (this->str);
}
stdString getStrVal(){
return stdString(this->str);
}
~StringPtr(){
}
};
%}
/////////////////// Export StringPtr to Java
class StringPtr{
public:
StringPtr();
StringPtr(const stdString & str);
stdString getStrVal();
~StringPtr();
};
// I think this is nor necessary
%rename ("$ignore", fullname=1) "StringPtr::getStrRef";
%extend MyClass {
void method1(cons std::string & name, StringPtr & result){
$self->method1(name, result.getStrRef());
}
bool method2(cons std::string & name, cons std::string & alias, StringPtr & returnValue, StringPtr & returnType){
$self->method2(name, alias, returnValue.getStrRef(), returnType.getStrRef());
}
};
%rename ("$ignore", fullname=1) "MyClass::method1";
%rename ("$ignore", fullname=1) "MyClass::method2";
%include "MyClass.h"
したがって、パフォーマンスの観点から、ウィッチの方が優れているのではないかと思います。構造体ソリューション(Flexoによる)、Flexoによる文字列配列、またはこのポインター(メンバーが1つしかない構造体のように)。