1

根据 Java JNI Specification Native Method Arguments

JNI 接口指针是本地方法的第一个参数。JNI 接口指针的类型为 JNIEnv。第二个参数根据本机方法是静态的还是非静态的而有所不同。非静态本机方法的第二个参数是对对象的引用。静态本地方法的第二个参数是对其 Java 类的引用。

所以一个原生的函数实现应该至少包含两个本地参数:第一个是JNIEnv,第二个是jobjectjclass,但是在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>

4

0 回答 0