register_android_os_Parcel
register_jni_procs(gRegJNI, NELEM(gRegJNI), env)开始注册jni方法。下面重点查看一下gRegJNI数组的register_android_os_Parcel类型。
int register_android_os_Parcel(JNIEnv* env) {
jclass clazz;
clazz = env->FindClass(kParcelPathName);
gParcelOffsets.clazz = (jclass) env->NewGlobalRef(clazz);
gParcelOffsets.mNativePtr = env->GetFieldID(clazz, "mNativePtr", "I");
gParcelOffsets.obtain = env->GetStaticMethodID(clazz, "obtain", "()Landroid/os/Parcel;");
gParcelOffsets.recycle = env->GetMethodID(clazz, "recycle", "()V");
return AndroidRuntime::registerNativeMethods(env, kParcelPathName,
gParcelMethods, NELEM(gParcelMethods));
}
const char* const kParcelPathName = "android/os/Parcel";
上述方法在保存了Parcel类的相关信息后,注册了其相关的jni映射。
static const JNINativeMethod gParcelMethods[] = {
{"nativeDataSize", "(I)I", (void*)android_os_Parcel_dataSize},
{"nativeDataAvail", "(I)I", (void*)android_os_Parcel_dataAvail},
{"nativeDataPosition", "(I)I", (void*)android_os_Parcel_dataPosition},
{"nativeDataCapacity", "(I)I", (void*)android_os_Parcel_dataCapacity},
{"nativeSetDataSize", "(II)V", (void*)android_os_Parcel_setDataSize},
{"nativeSetDataPosition", "(II)V", (void*)android_os_Parcel_setDataPosition},
{"nativeSetDataCapacity", "(II)V", (void*)android_os_Parcel_setDataCapacity},
{"nativePushAllowFds", "(IZ)Z", (void*)android_os_Parcel_pushAllowFds},
{"nativeRestoreAllowFds", "(IZ)V", (void*)android_os_Parcel_restoreAllowFds},
{"nativeWriteByteArray", "(I[BII)V", (void*)android_os_Parcel_writeNative},
{"nativeWriteInt", "(II)V", (void*)android_os_Parcel_writeInt},
{"nativeWriteLong", "(IJ)V", (void*)android_os_Parcel_writeLong},
{"nativeWriteFloat", "(IF)V", (void*)android_os_Parcel_writeFloat},
{"nativeWriteDouble", "(ID)V", (void*)android_os_Parcel_writeDouble},
{"nativeWriteString", "(ILjava/lang/String;)V", (void*)android_os_Parcel_writeString},
{"nativeWriteStrongBinder", "(ILandroid/os/IBinder;)V", (void*)android_os_Parcel_writeStrongBinder},
{"nativeWriteFileDescriptor", "(ILjava/io/FileDescriptor;)V", (void*)android_os_Parcel_writeFileDescriptor},
{"nativeCreateByteArray", "(I)[B", (void*)android_os_Parcel_createByteArray},
{"nativeReadInt", "(I)I", (void*)android_os_Parcel_readInt},
{"nativeReadLong", "(I)J", (void*)android_os_Parcel_readLong},
{"nativeReadFloat", "(I)F", (void*)android_os_Parcel_readFloat},
{"nativeReadDouble", "(I)D", (void*)android_os_Parcel_readDouble},
{"nativeReadString", "(I)Ljava/lang/String;", (void*)android_os_Parcel_readString},
{"nativeReadStrongBinder", "(I)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder},
{"nativeReadFileDescriptor", "(I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_readFileDescriptor},
{"openFileDescriptor", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_openFileDescriptor},
{"dupFileDescriptor", "(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;", (void*)android_os_Parcel_dupFileDescriptor},
{"closeFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_closeFileDescriptor},
{"clearFileDescriptor", "(Ljava/io/FileDescriptor;)V", (void*)android_os_Parcel_clearFileDescriptor},
{"nativeCreate", "()I", (void*)android_os_Parcel_create},
{"nativeFreeBuffer", "(I)V", (void*)android_os_Parcel_freeBuffer},
{"nativeDestroy", "(I)V", (void*)android_os_Parcel_destroy},
{"nativeMarshall", "(I)[B", (void*)android_os_Parcel_marshall},
{"nativeUnmarshall", "(I[BII)V", (void*)android_os_Parcel_unmarshall},
{"nativeAppendFrom", "(IIII)V", (void*)android_os_Parcel_appendFrom},
{"nativeHasFileDescriptors", "(I)Z", (void*)android_os_Parcel_hasFileDescriptors},
{"nativeWriteInterfaceToken", "(ILjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken},
{"nativeEnforceInterface", "(ILjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface},
};
在后续的Java层的调用native方法时需要跳转到对应的C/C++代码中。