Я использовал SWIG для генерации некоторого нативного интерфейса функций JNI для движка Irrlicht C / C ++ 3D, и я получил набор прокси-классов java и промежуточные файлы c / c ++, которые реализуют нативные функции java для склеивания прокси-классов java иIrrlicht C / C ++ 3d engine.
Все прокси-классы Java создаются в пакете net.sf.jirr.И сгенерированные нативные методы java определены в классе net.sf.jirr.JirrJNI.
Поскольку имя сгенерированных SWIG функций jni c / c ++ не соответствует стандартному соглашению о вызовах функций jni для Android, мне нужно зарегистрировать этот нативный метод java с соответствующей функцией jni C / C ++.
т.е. возьмите сгенерированный нативный метод java net.sf.jirr.JirrJNI.SColor_setRed, например: сгенерированный нативный метод java определен как:
public final static native void SColor_setRed(long jarg1, SColor jarg1_, long jarg2);
Сгенерированная j / функция c / c ++:определяется как:
SWIGEXPORT void JNICALL Java_net_sf_jirr_JirrJNI_SColor_1setRed(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2)
Поскольку функция jni c / c ++ не соответствует соглашению о вызовах функций jni для Android c / c ++ (в этом случае имя сгенерированной функции jni c / c ++ должно быть Java_net_sf_jirr_JirrJNI_SColor_setRed, если это необходимовызываться без регистрации встроенной функции в функции JNI_OnLoad.)
Итак, я пытаюсь зарегистрировать встроенные методы вручную, например:
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 aи сгенерируйте набор макросов SET_A_JNI_METHOD (......) для всех собственных методов java.
В этом макросе 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?