2

問題はかなり単純です。SWIG 2.0.8 を使用してラップしたい C++ 名前空間にいくつかの定数があります。次のようになります。

namespace Example {
    static const float PI = 3.14159f
    ...
    /* Lots of classes are here */
}

残念ながら、SWIG はこれをややぎこちなく処理します。C# の場合、名前空間と同じ名前のクラスに定数が追加されるため、Example.Example.PI明示的にusing Example(モジュール名によるマスキングのため) であっても、使用してアクセスする必要があります。

Javaでは、それを定数としてまったく扱わずExample.getPI()、定数クラス変数の代わりにメソッド呼び出しとして使用することを余儀なくされているため、さらに悪い.

定数をグローバル名前空間に移動すると、これは機能するように見えますが、変数には を使用してアクセスする必要がありますExampleConstants.PI

Example.PI理想的には、C++ と一貫性を保つために、両方の言語で定数にアクセスできるようにしたいと考えています。しかし、どちらの言語でもConstants使用できるように、名前空間内にクラスを含めることができれば、満足できる妥協案です。Constants.PIしかしもちろん、C++ では非整数型をクラス内で定義することはできず、これはまだ Java の問題を解決していません。

SWIG でこれらの名前空間定数を処理するエレガントな方法はありますか? そうでない場合、Java または C# クラスを手動で追加して定義する方法はありますか?

4

1 に答える 1

2

C++ - C# の同様の問題を解決しました。これがまさにあなたが探しているものかどうかはわかりませんが、あなたにとって役立つ情報が見つかることを願っています.

私は自分のプロジェクトで Java コードに触れていません。

Swig ソリューション。

C++ で public static パラメータなし関数を持つクラスを作成しました。

次に、SWIG を使用してそれらを C# にエクスポートしました。
コマンドラインで C# の名前空間を-namespace <name>キーで指定しました。詳細については、SWIG および C#ページを参照してください。

Constants::PI()その結果、定数にアクセスするためのソリューションを実装できますConstants.PI()

直接解法

SWIG やその他のライブラリを使用したくない場合は、PInvokeを使用する必要があります。それを扱う場合、多くの詳細と特殊なケースがあります。私が見つけた主題に関する最も包括的な記事は、Mono Interop with Native Librariesです。

Java 用のJNIを検討する必要があります。

C++ 関数は名前空間なしで純粋な C 関数としてエクスポートされることに注意してください。C# クラスを作成し、関数を名前空間にラップするDllImport 属性を持つ関数を作成する必要があります。

一般に、C++ インターフェイスが多かれ少なかれ固定されているか小さい場合、私は直接的な解決策を順守します。SWIG レイヤーには、PInvoke/JNI とともに学習する必要がある多くの特定のケースがあるためです。しかし、C++ インターフェイスが頻繁に変更され、C++、C#、および Java の一貫性を維持するために多大な労力が必要な場合は、間違いなく SWIG を検討する必要があります。

https://stackoverflow.com/a/11909571/13441で PInvoke を使用した重要な例を見つけることができます。

C++ 定数について。クラス内に C++ 定数を指定できます。詳細については、 C++ 静的定数文字列 (クラス メンバ)を参照してください。

SWIG 1.3.40 を使用しています。

これが役に立てば幸いです。

于 2012-12-30T02:04:17.127 に答える