根据Java JNI规范Native Method Arguments:
JNI接口指针是本机方法的第一个参数。该 JNI接口指针的类型为JNIEnv。 第二个参数不同 取决于本机方法是静态还是非静态方法。该 非静态本机方法的第二个参数是对它的引用 宾语。静态本机方法的第二个参数是引用 到它的Java类。
因此,本机函数实现应包含至少两个本地参数:第一个是 JNIEnv ,第二个是 jobject 或 jclass ,但在android中框架有许多代码与这些规则相混淆,例如:
android.googlesource.com/platform/frameworks/base / + / cd92588 / media / java / android / media / MediaScanner.java#1822
private static native final void native_init();
android.googlesource.com/platform/frameworks/base / + /主/媒体/ JNI / android_media_MediaScanner.cpp#375
static void android_media_MediaScanner_native_init(JNIEnv *env)
{
ALOGV("native_init");
jclass clazz = env->FindClass(kClassMediaScanner);
if (clazz == NULL) {
return;
}
fields.context = env->GetFieldID(clazz, "mNativeContext", "J");
if (fields.context == NULL) {
return;
}
}
功能注册:
{
"native_init",
"()V",
(void *)android_media_MediaScanner_native_init
},
android_media_MediaScanner_native_init只接收一个参数,那么是否有任何dalvik或艺术运行时技巧或其他原因?