您的位置:首页 > 移动开发 > Android开发

Android 中Native方法是怎样调用的

2010-12-25 12:33 441 查看

1.  Power.java--> find corresponding native cfile(查找对应的具体用C实现的C文件)

         android.os.Power.java -------- native file ---->.../jni/android_os_Power.c
 
2. in android_os_Power.c, you canfind:
 

static JNINativeMethod method_table[]=   // Native functiontable
{
    {"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 tablefrom name to function
{
    returnAndroidRuntime::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 becalled
                                  ---> AndroidRuntime::registerNativeMethods(env, class_namelike "android/os/Power", method table like method_table,size)
                                         ---> jniRegisterNativeMethods(env, className,gMethods, numMethods)
                                                  -->pEnv->RegisterNatives(env, clazz, gMethods,numMethods) ;
                                                       --> foreach(method) calldvmRegisterJNIMethod(ClassObject* clazz, const char*methodName,
                                                                                                                                     constchar* signature, void* fnPtr) 
                                                             -->   calldvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); //for sycn method
                                                                  or
                                                                      call dvmSetNativeFunc(method, dvmCallJNIMethod,fnPtr);
                                                                     -->   ((Method*)method)->insns = insns; // set actual codespace 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);
       }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息