How native function is called in…

本文详细介绍了Android平台中Java层如何调用本机层的C/C++函数,包括从Java方法到C/C++函数的映射过程、注册本机方法的过程以及具体的调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

How native function is called in Android platform ( unfinished version)

1.  Power.java --> find corresponding native c file
          android.os.Power.java -------- native file ----> .../jni/android_os_Power.c
 
2. in android_os_Power.c, you can find:
 
static JNINativeMethod method_table[] =   // Native function table
{
    { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
    { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
    { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
    { "setScreenState", "(Z)I", (void*)setScreenState },
    { "shutdown", "()V", (void*)android_os_Power_shutdown },
    { "reboot", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
};
 
int register_android_os_Power(JNIEnv *env) // function to register mapping table from name to function
{
    return AndroidRuntime::registerNativeMethods(
        env, "android/os/Power",
        method_table, NELEM(method_table));
}
3. in /framework/base/core/jni , a file named: AndroidRuntime.cpp
 
    3.1) a global register function array
            static const RegJNIRec gRegJNI[] =
            {
                      ...
                      register_android_os_Power,
           }
 
    3.2) Register native function process
                   int AndroidRuntime::startReg(JNIEnv* env)
           or
                  Java_com_android_internal_util_WithFramework_registerNatives(...)
           or
                 Java_LoadClass_registerNatives(....)
                   ---> register_jni_procs(gRegJNI, NELEM(gRegJNI), env)
                           ---> foreach(member of gRegJNI)  call register_XXX_XXX_XXX..XXX()  // so here register_android_os_power() will be called
                                   ---> AndroidRuntime::registerNativeMethods(env, class_name like "android/os/Power", method table like method_table, size)
                                          ---> jniRegisterNativeMethods(env, className, gMethods, numMethods)
                                                  --> pEnv->RegisterNatives(env, clazz, gMethods, numMethods) ;
                                                        --> foreach(method) call dvmRegisterJNIMethod(ClassObject* clazz, const char* methodName,
                                                                                                                                     const char* signature, void* fnPtr) 
                                                              -->   call dvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); // for sycn method
                                                                  or
                                                                      call  dvmSetNativeFunc(method, dvmCallJNIMethod, fnPtr);
                                                                      -->    ((Method*)method)->insns = insns; // set actual code space to be executed for a native function
      
4. calling a native method ( JNI method)
    void dvmPlatformInvoke(void* pEnv, ClassObject* clazz, int argInfo, int argc,
    const u4* argv, const char* shorty, void* func, JValue* pReturn)
    dvmCallMethod() /dvmInvokeMethod
     --->     if (dvmIsNativeMethod(method))
         {
                   (*method->nativeFunc)(self->curFrame, &retval, method, self);
         }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值