Android JNI与Java JNI规范冲突
根据Java JNI规范: JNI接口指针是本机方法的第一个参数。这个 JNI接口指针的类型为JNIEnv。第二个参数不同 取决于本机方法是静态的还是非静态的。这个 非静态本机方法的第二个参数是对 对象静态本机方法的第二个参数是引用 到它的Java类 因此,本机函数实现应该至少包含两个本地参数:第一个是JNIEnv,第二个是jobject或jclass,但在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 功能注册: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
{
"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
},