Irrlicht C/C++ 3D エンジン用のネイティブ JNI 関数インターフェイスを生成するために SWIG を使用し、多数の Java プロキシ クラスと、Java ネイティブ関数を実装して Java プロキシ クラスと Irrlicht C/ C++ 3D エンジン。
すべての 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 関数は android c/c++ jni 関数呼び出し規則に準拠していないため (この場合、JNI_OnLoad 関数内でネイティブ関数を登録せずに呼び出す必要がある場合、生成された c/c++ jni 関数名は Java_net_sf_jirr_JirrJNI_SColor_setRed にする必要があります) .)
だから、私は次のようなネイティブメソッドを手動で登録しようとしています:
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;
}
ここで、JNI_REG_CLASS、JNI_METHODS、JNI_METHODS_COUNT は次のように定義されます。
#define SET_A_JNI_METHOD(name, signature, func_ptr) \
{ (char*)#name, (char*)signature, (void*)func_ptr }
const char* JNI_REG_CLASS = "net/sf/jirr/JirrJNI";
JNINativeMethod JNI_METHODS[] = { SET_A_JNI_METHOD(SColor_setRed, "(JLnet/sf/jirr/SColor;J)V", Java_net_sf_jirr_JirrJNI_SColor_1setRed), ......};
int JNI_METHODS_COUNT = sizeof(JNI_METHODS) / sizeof(JNI_METHODS[0]);
したがって、net.sf.jirr.JirrJNI クラスを解析し、すべての Java ネイティブ メソッドに対して一連の SET_A_JNI_METHOD(......) マクロを生成する必要があります。
この SET_A_JNI_METHOD マクロでは、名前部分は単なる Java ネイティブ関数名です。署名部分は、java jni メソッドの署名標準 (公式の java jni JNINativeMethodリファレンスで説明されています) に準拠しています。func_ptr 部分は Java_$(PackageName)_ をプレフィックスとして追加し、Java ネイティブ メソッド名 (ここでは "_" で区切られています) の各部分 (クラス名部分を除く) にインデックス番号を追加します。すなわち:
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 正規表現でこれを行う方法に関するヒントはありますか?