Android基础之Binder分析

}

// 306 运行AndroidRuntime.cpp的start方法
if (zygote) {  
runtime.start(“com.android.internal.os.ZygoteInit”, args, zygote);
}

1-3.AndroidRuntime::start

调用startReg方法来完成jni方法的注册。

frameworks/base/core/jni/AndroidRuntime.cpp

//frameworks/base/core/jni/AndroidRuntime.cpp

// 1007
void AndroidRuntime::start(const char* className, const Vector& options, bool zygote)

// 1051
if (startReg(env) < 0) {

//1440
int AndroidRuntime::startReg(JNIEnv* env)

// 1459 注册jni方法
if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {

// 1283
static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env) {  
// 循环注册jni方法
for (size_t i = 0; i < count; i++) {      
if (array[i].mProc(env) < 0) {          
return -1;      
}  
}  
return 0;
}

// 1296
static const RegJNIRec gRegJNI[] = {

// 1312
REG_JNI(register_android_os_Binder),

}

2.register_android_os_Binder

//frameworks/base/core/jni/android_util_Binder.cpp

// 1282
int register_android_os_Binder(JNIEnv* env) {  
if (int_register_android_os_Binder(env) < 0)      
return -1;  
if (int_register_android_os_BinderInternal(env) < 0)      
return -1;  
if (int_register_android_os_BinderProxy(env) < 0)      
return -1;
}

2-1.int_register_android_os_Binder

//frameworks/base/core/jni/android_util_Binder.cpp

// 843
static const JNINativeMethod gBinderMethods[] = {    
/* name, signature, funcPtr /  
{ “getCallingPid”, “()I”, (void
)android_os_Binder_getCallingPid },  
{ “getCallingUid”, “()I”, (void*)android_os_Binder_getCallingUid },  
{ “clearCallingIdentity”, “()J”, (void*)android_os_Binder_clearCallingIdentity },  
{ “restoreCallingIdentity”, “(J)V”, (void*)android_os_Binder_restoreCallingIdentity},
{ “setThreadStrictModePolicy”, “(I)V”, (void*)android_os_Binder_setThreadStrictModePolicy },  
{ “getThreadStrictModePolicy”, “()I”, (void*)android_os_Binder_getThreadStrictModePolicy },  
{ “flushPendingCommands”, “()V”, (void*)android_os_Binder_flushPendingCommands },  
{ “init”, “()V”, (void*)android_os_Binder_init },  
{ “destroy”, “()V”, (void*)android_os_Binder_destroy },  
{ “blockUntilThreadAvailable”, “()V”, (void*)android_os_Binder_blockUntilThreadAvailable }
};

// 857
const char* const kBinderPathName = “android/os/Binder”;

// 859
static int int_register_android_os_Binder(JNIEnv* env) {  
// 查找文件 kBinderPathName = “android/os/Binder”,返回对应Class对象
jclass clazz = FindClassOrDie(env, kBinderPathName);
// 通过gBinderOffsets结构体,保存Java层Binder类的信息,为JNI层访问Java层提供通道
gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz);  
gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, “execTransact”, “(IJJI)Z”);  
gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, “mObject”, “J”);
// 通过RegisterMethodsOrDie,将为gBinderMethods数组完成映射关系,从而为Java层访问 JNI层提供通道
return RegisterMethodsOrDie(      
env, kBinderPathName,      
gBinderMethods,
NELEM(gBinderMethods));
}

2-2.int_register_android_os_BinderInternal

//frameworks/base/core/jni/android_util_Binder.cpp

// 925
static const JNINativeMethod gBinderInternalMethods[] = {    
/* name, signature, funcPtr /  
{ “getContextObject”, “()Landroid/os/IBinder;”, (void
)android_os_BinderInternal_getContextObject },  
{ “joinThreadPool”, “()V”, (void*)android_os_BinderInternal_joinThreadPool },  
{ “disableBackgroundScheduling”, “(Z)V”, (void*)android_os_BinderInternal_disableBackgroundScheduling },  
{ “handleGc”, “()V”, (void*)android_os_BinderInternal_handleGc } };

// 933
const char* const kBinderInternalPathName = “com/android/internal/os/BinderInternal”;

// 935
static int int_register_android_os_BinderInternal(JNIEnv* env){  
// 查找文件kBinderInternalPathName = “com/android/internal/os/BinderInternal”,返回Class对象
jclass clazz = FindClassOrDie(env, kBinderInternalPathName);
// 通过gBinderInternalOffsets,保存Java层BinderInternal类的信息,为JNI层访问java 层提供通道
gBinderInternalOffsets.mClass = MakeGlobalRefOrDie(env, clazz);
gBinderInternalOffsets.mForceGc = GetStaticMethodIDOrDie(env, clazz, “forceBinderGc”, “()V”);

// 通过RegisterMethodsOrDie(),将为gBinderInternalMethods数组完成映射关系,从而为 Java层访问JNI层提供通道
return RegisterMethodsOrDie(      
env, kBinderInternalPathName,      
gBinderInternalMethods,
NELEM(gBinderInternalMethods));
}

2-3.int_register_android_os_BinderProxy

//frameworks/base/core/jni/android_util_Binder.cpp

// 1241
static const JNINativeMethod gBinderProxyMethods[] = {    
/* name, signature, funcPtr /  
{“pingBinder”,         “()Z”, (void
)android_os_BinderProxy_pingBinder},  
{“isBinderAlive”,       “()Z”, (void*)android_os_BinderProxy_isBinderAlive},  
{“getInterfaceDescriptor”, “()Ljava/lang/String;”, (void*)android_os_BinderProxy_getInterfaceDescriptor},
{“transactNative”,     “(I

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值