いずれ必要になる粟田君への引き継ぎ/説明資料と自分の覚え書き/作業日誌を兼ねて経過を記す.
C++で書かれているMOS(mapmos.dll)のJavaラッパーをJNIを使用して構築する.現在できているJMOSSiteを例に大まかな手順を以下に述べる.
#ラッパークラスのJava側のインタフェースを記述する(JMOSSite.java)#javac JMOSSite.java -> JMOSSite.class#javah -jni JMOSSite -> JMOSSite.h#JMOSSite.h を元に jniJMOSSite.cpp を記述する#jniJMOSSite.cpp をコンパイル -> jni.dll##VC++で"Win32 Dynamic link library"のプロジェクトを作る.名前は "jci".##プロジェクト設定で"共有DLLでMFCを使用"を選択##jniJMOSSite.cpp/JMOSSite.h に加え, Registry.cpp, Registry.h, getHashCode.cpp, getHashCode.h, ObjMap.cpp, ObjMap.h, ObjMapEntry.cpp, ObjMapEntry.h を併せてプロジェクトに追加.##C++のパラメタに /I "F:\jdk1.2\include" /I "F:\jdk1.2\include\win32" /I "C:\ci20src\MOS" を追加.##リンクのパラメタに /libpath:"C:\ci20src\MOS\Release" "C:\ci20src\MOS"を追加.##PATHに C:\Cool_ICE を追加##ビルドでjci.dllが生成される.#ラッパークラスを呼び出す実行クラス(JCIMain.class)を作成.jci.dllが生成されるdirectory(Debug)と同じ場所に置く.#JMOSSite.classも同じ場所(Debug)へコピー#Java JCIMain
これでMOSで提供されるクラス:CMOSSiteのラッパーが完成するはずであるが,現在"Abnormal Execution"のエラーが出て,実行不能.原因解析中.
C/C++側で定義される関数呼び出しは,引数/戻り値の型さえ注意すれば容易であるが,問題はC++側のクラス->インスタンスの実態をどう管理するかである.ここでは,専用のRegistryクラスを設け,クラス初期化のタイミングでインスタンスへのポインタをRegistryに登録,メソッド呼び出しの際にはこの Registryからインスタンスへのポインタを得る,という方法を採っている.