Irrigicht C/C++ 3Dエンジン用のネイティブJNI関数インタフェースを生成するためにSWIGを使用しました。 JavaプロキシクラスとIrrlicht C/C++ 3dエンジンをグルーピングするためのJavaネイティブ関数Python正規表現を使用してAndroidのjniメソッドのシグネチャの生成を自動化
すべてのJavaプロキシクラスは、net.sf.jirrパッケージ内で生成されます。生成されたJavaネイティブメソッドは、net.sf.jirr.JirrJNIクラスで定義されています。
SWIGで生成されたc/C++ jni関数の名前がデフォルトのandroid jni関数呼び出し規約に準拠していないため、これらのJavaネイティブメソッドを対応するC/C++ jni関数に手動で登録する必要があります。
すなわち例えば生成されるJavaネイティブメソッドnet.sf.jirr.JirrJNI.SColor_setRedしてください:生成されたJavaネイティブメソッドは次のように定義されて :
public final static native void SColor_setRed(long jarg1, SColor jarg1_, long jarg2);
生成されたC/C++ JNI関数は次のように定義されています:
としてSWIGEXPORT void JNICALL Java_net_sf_jirr_JirrJNI_SColor_1setRed(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2)
C/C++ JNIそれはなしで呼び出される必要がある場合には、生成されたC/C++ JNI関数名がJava_net_sf_jirr_JirrJNI_SColor_setRedする必要があり、この場合には(アンドロイドC/C++ JNI関数呼び出し規則に準拠していない機能登録する。グラムネイティブ関数JNI_OnLoad関数内)
だから、私のようである手動でネイティブメソッドを登録しようとしている:
JNI_REG_CLASS、JNI_METHODS、JNI_METHODS_COUNTは次のように定義されているJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
......
if (!registerNativeMethods(env, JNI_REG_CLASS, (JNINativeMethod*)JNI_METHODS, JNI_METHODS_COUNT)) {
return -1;
}
/* success -- return valid version number */
result = JNI_VERSION_1_4;
return result;
}
:
したがって、net.sf.jirr.JirrJNIクラスを解析して、すべてのJavaネイティブメソッドのSET_A_JNI_METHOD(......)マクロを生成する必要があります。
このSET_A_JNI_METHODマクロでは、名前部分はJavaのネイティブ関数名です。署名部分はjava jniメソッドの署名標準(公式のjava jni JNINativeMethodリファレンスで説明されています)に準拠しています。 func_ptr部分は、Javaのネイティブメソッド名(ここでは "_"で区切られた)の各部分(クラス名部分を除く)にいくつかのインデックス番号を追加する接頭辞としてJava _ $(PackageName)_を追加することです。 すなわち:
Java native method: IFileSystem_getFileDir
name part: IFileSystem_getFileDir;
func_ptr part: Java_net_sf_jirr_JirrJNI_IFileSystem_1getFileDir;
Java native method: IFileSystem_addFolderFileArchive__SWIG_0
name part: IFileSystem_addFolderFileArchive__SWIG_0;
func_ptr part: Java_net_sf_jirr_JirrJNI_IFileSystem_1addFolderFileArchive_1_1SWIG_10
これはPythonの正規表現で行わ取得する方法上の任意のヒント?
あなたの質問をちょっと整理して、それをよりよく理解するようにしました。私はまだ知りたいことがたくさんあると思います。私は、あなたは、Java関数宣言とクラス名から 'SET_A_JNI_METHOD'行を生成したいと思いますが、私は署名やfunc_ptrがどのように派生しているのか正確には分かりません(特に' SColor_1setRed'部分)。一般的な言葉であなたの蟻を説明してください。 – Borodin
どちらか分かりません。 SWIGは、C++とJava側の両方でラッパー関数を生成して、これをすべて処理する必要があります。 – Thomas
申し訳ありませんが自分自身をよく理解していない。私はより詳細な情報で私の質問を編集しました。 – David