JNI(Java Native Interface)に関連するほとんどのドキュメントまたはヘルパーライブラリは、Javaからのネイティブコードの呼び出しに関係しているようです。それ以上の能力があるにもかかわらず、これが主な用途のようです。
私は主に反対の方向で作業したいと思います。既存の(かなり大きな)ポータブルC ++プログラムに、いくつかのJavaライブラリを追加して変更します。たとえば、JDBCを介してデータベースを呼び出したり、JMSを介してメッセージキューシステムを呼び出したり、電子メールを送信したり、独自のJavaクラスを呼び出したりしたいのですが、生のJNIでは、これはかなり不快でエラーが発生しやすくなります。
したがって、理想的には、C ++/CLIがCLRクラスを呼び出すのと同じくらい簡単にJavaクラスを呼び出すことができるC++コードを記述したいと思います。何かのようなもの:
using namespace java::util::regex; // namespaces mapped
Pattern p = Pattern.compile("[,\\s]+");
array<java::lang::String> result =
p.split("one,two, three four , five");
for (int i=0; i < result.length(); i++)
std::cout << result[i] << std::endl;
このように、名前と奇妙な署名文字列を渡すことによってメソッドIDを取得する作業を手動で行う必要がなく、メソッドを呼び出すためのチェックされていないAPIによって引き起こされるプログラミングエラーから保護されます。実際、同等のJavaによく似ています。
NB。私はまだJNIの使用について話し合っています!基盤となるテクノロジーとして、それは私のニーズに最適です。それは「進行中」であり、非常に効率的です。別のプロセスでJavaを実行して、RPC呼び出しを行いたくありません。JNI自体は問題ありません。私はそれに快適なインターフェースが欲しいだけです。
私が指定する一連のJavaクラスによって公開されるものと完全に一致するように、同等のC ++クラス、名前空間、メソッドなどを作成するためのコード生成ツールが必要になります。生成されたC++クラスは次のようになります。
- 同様にラップされたバージョンのパラメーターを受け入れるメンバー関数を用意し、必要なJNIブードゥーを実行して呼び出しを行います。
- 自然な方法で呼び出しを連鎖できるように、同じ方法で戻り値をラップします。
- メソッドIDのクラスごとの静的キャッシュを維持して、毎回検索しないようにします。
- 完全にスレッドセーフで、ポータブルで、オープンソースであること。
- すべてのメソッド呼び出しの後に例外を自動的にチェックし、stdC++例外を生成します。
- また、通常のJNIの方法でネイティブメソッドを記述しているが、他のJavaコードを呼び出す必要がある場合にも機能します。
- 配列は、プリミティブ型とクラスの間で完全に一貫して機能する必要があります。
- ローカル参照フレームの外で存続する必要がある場合に参照をラップするためにグローバルのようなものが必要になることは間違いありません-繰り返しますが、すべての配列/オブジェクト参照で同じように機能するはずです。
そのような無料のオープンソースのポータブルライブラリ/ツールは存在しますか、それとも私は夢を見ていますか?
注:私はこの既存の質問を見つけましたが、その場合のOPは、私がしているほど完璧を要求するものではありませんでした...
更新: SWIGについてのコメントは、この前の質問に私を導きました。これは、それがほとんど反対方向についてであり、したがって私が望むことをしないことを示しているようです。
重要
- これは、Javaクラスとオブジェクトを操作するC ++コードを記述できることについてであり、その逆ではありません(タイトルを参照してください)。
- JNIが存在することはすでに知っています(質問を参照してください)。しかし、JNI APIへの手書きのコードは、不必要に冗長で、反復的で、エラーが発生しやすく、コンパイル時に型チェックされません。メソッドIDとクラスをキャッシュする場合オブジェクトそれはさらに冗長です。これらすべてを処理するC++ラッパークラスを自動的に生成したいと思います。
更新:私は自分の解決策に取り組み始めました:
https://github.com/danielearwicker/cppjvm
これがすでに存在する場合は、私に知らせてください!
NB。自分のプロジェクトでこれを使用することを検討している場合は、遠慮なく言ってください。ただし、現在、コードは数時間前のものであり、これまでに作成したテストは3つだけです。