根据 Java JNI Specification 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/+/master/media/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 或者art runtime 技巧或者其他原因吗?</p>