Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JNI与Java JNI规范冲突_Java_Android_Java Native Interface_Dalvik_Art Runtime - Fatal编程技术网

Android JNI与Java JNI规范冲突

Android JNI与Java JNI规范冲突,java,android,java-native-interface,dalvik,art-runtime,Java,Android,Java Native Interface,Dalvik,Art Runtime,根据Java JNI规范: JNI接口指针是本机方法的第一个参数。这个 JNI接口指针的类型为JNIEnv。第二个参数不同 取决于本机方法是静态的还是非静态的。这个 非静态本机方法的第二个参数是对 对象静态本机方法的第二个参数是引用 到它的Java类 因此,本机函数实现应该至少包含两个本地参数:第一个是JNIEnv,第二个是jobject或jclass,但在android框架中,有许多代码与这些规则相冲突,例如: android.googlesource.com/platform/framewo

根据Java JNI规范:

JNI接口指针是本机方法的第一个参数。这个 JNI接口指针的类型为JNIEnv。第二个参数不同 取决于本机方法是静态的还是非静态的。这个 非静态本机方法的第二个参数是对 对象静态本机方法的第二个参数是引用 到它的Java类

因此,本机函数实现应该至少包含两个本地参数:第一个是JNIEnv,第二个是jobjectjclass,但在android框架中,有许多代码与这些规则相冲突,例如:

android.googlesource.com/platform/frameworks/base/+/cd92588/media/java/android/media/MediaScanner.java#1822

android.googlesource.com/platform/frameworks/base/+/master/media/jni/android\u media\u MediaScanner.cpp#375

功能注册:

{
    "native_init",
    "()V",
    (void *)android_media_MediaScanner_native_init
},

android\u media\u MediaScanner\u native\u init只接收一个参数,所以是否存在dalvik或art运行时技巧或其他原因?

对我来说,这看起来像是坏代码。它似乎依赖于平台的调用约定,忽略了
android\u media\u MediaScanner\u native\u init()
jclass
参数。这似乎也没有什么意义——代码试图使用
kClassMediaScanner
定位类。假设这是该代码所属的
MediaScanner
类,则必须编写额外的代码来缓存JVM传递的值。有人留下了一条注释,但注释消失了,我不知道为什么,原始注释是:很像@AndrewHenle,谢谢。这对我来说似乎是个糟糕的代码。它似乎依赖于平台的调用约定,忽略了
android\u media\u MediaScanner\u native\u init()
jclass
参数。这似乎也没有什么意义——代码试图使用
kClassMediaScanner
定位类。假设这是该代码所属的
MediaScanner
类,则必须编写额外的代码来缓存JVM传递的值。有人留下了注释,但注释消失了,我不知道为什么,原始注释是:它非常像@AndrewHenle,谢谢。
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
},