質問: マルチOSな3DゲームをJavaで作ろうと思い立ったところ、c++でDirect3DとOpenGLに対応した 、物理演算も可能なゲームエンジンライブラリを発見しました。とりあえずWindowsでdllの動作を確認しようとVC++でコンパイルしてはみたものの、全く連携方法がわかりません。Jnaを使ってdllを呼び出す方法も考えたのですが、そもそもVC++でコンパイルするとextern "C"なしではJnaから呼び出せなくなるようです(修飾名を使って呼び出せば出来るのかもしれませんが、マルチOSの主旨に反します)。そこでコマンドを使ってコンパイル前のソースの全ての__declspec(dllexport)のある行頭にextern "C"を付けてみたのですが、無論templateやoverrideでエラーだらけになるわけで...... どうしたらそのc++ライブラリをJavaから呼び出せるのでしょうか? 追記 ライブラリ名はUrho3Dです。 BridJでの手動コードでテストdllの読み込みが行えたため、BridJのJavaコードを自動生成するプログラムを書きながらもっと楽な手段の回答を待つことにします。
回答: ポータビリティを考えると`extern "C"`することにさほど問題があるようには思えませんが、それはさておき。 自身で実際に試したわけではないですが、こちらが参考にならないでしょうか。 * JNAerated library does not work when the original library has namespaces #515 ここで言及されているのは、JNAのドキュメントにも何度か登場するJNAeratorというユーティリティです。 このユーティリティのコマンドラインオプションにBridJを指定してみては、ということですね。(参考: JNAratorのコマンドラインオプション) BridJには`VC9Demangler`なんていうクラスも有りますので、何かやってくれそうな雰囲気ではあります。(追記: C++ support in BridJというページが有りました。) ただし、仮にうまく行ったとして、自動生成されたファイルはVC++のDLL専用のものになるはずですので、ポータビリティが損なわれることには変わりないですね(VC用とそれ以外用の2種類自動生成すればいいだけですが(理想的には))。 JNAratorの使い方自体は、検索すると日本語の解説も見つかるかと思います(古いものはオプション等が違いますので注意は必要です)。 (追記: `FunctionMapper`を独自実装するすることで、BridJ無しでも実現できそうです。ただし関数名とマングリングされた名前を手動で実装することになると思います。) どうしても今の形のDLLをそのまま使用したいのであれば、そのDLLを呼び出すラッパーDLLを(JNIなどで)作成し、Javaからはそれを呼ぶ、という手段も考えられます。 ここで作成するDLLのソースコードは、頑張ればポータビリティを保てるかもしれません。 質問文を読みなおしましたところ、手間を掛けずにJavaで特定のライブラリを使用したいだけなのかな、とも思いました。 もしそうであるなら、そのライブラリの名称を明記して、このライブラリをJavaで使いたいのだがどうすれば?という質問にした方が明確な回答が得られるかと考えます。