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);
       }

Android 中Native方法是怎样调用的相关推荐

  1. JNI中Native方法的注册方式

    文章目录 JNI中native方法注册 native方法静态注册 native方法动态注册 数据类型转换 方法签名: 使用javap自动生成方法签名 JNIEnv JNI中native方法注册 jni ...

  2. JAVA中native方法(实现例子)

    JAVA中native方法 鸣谢:http://blog.csdn.net/zhangliao613/article/details/6325978 Java不是完美的,Java的不足除了体现在运行速 ...

  3. java调用so库中的native方法_Java如何调用本地.so库里的方法

    首先在此之前希望你已经掌握了基本JNI常识的运用,比如Java代码如何调用本地native的方法,native方法如何访问本地变量,本地方法等以及其他相关的基础知识.在此我还是贴上Activity的部 ...

  4. android怎么查看方法被谁调用,Android中查看布局文件中的控件(view,id)在哪里被调用(使用)...

    在阅读别人的代码时通常是很痛苦的,有时很想要看一看布局中的控件在哪里被调用了,为之很苦恼 在这里提供一种方法. 复制要查看的控件ID,到R文件中搜索到该ID, 接下来就好办的了,选中ID按下Ctrl鼠 ...

  5. JAVA中native方法调用C语言实现学习

    在java虚拟机规范的内存管理划分中,对于虚拟机内存空间划分中专门划了一块内存叫做"本地方法栈(Native Method Stack)".本地方法栈是为了java专门用来调用na ...

  6. android中oncreate方法,android开发之onCreate( )方法详解

    这里我们只关注一句话:This is where you should do all of your normal static set up.其中我们只关注normal static, normal ...

  7. android中oncreate方法,Android解决在onCreate()中获取View的width、Height为0的方法

    前言 在activity中,经常需要获取view的width和height,但是在onCreate()获取view的width和height会得到0.view.getWidth()和view.getH ...

  8. android重写方法,android中native js中重写方法问题

    java代码: PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onS ...

  9. android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料

    由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...

最新文章

  1. linux卸载欧朋浏览器,如何在Centos下安装opera浏览器
  2. 批量过滤删除AD中的对象
  3. 一行python代码值多少钱_一行python代码
  4. 玩了5万局游戏,英伟达让GameGAN自己生成「吃豆人」,世界首创无需游戏引擎...
  5. 火狐浏览器表单不跳转_表单button的outline在firefox浏览器下的问题
  6. ConTeXt 文稿的逻辑结构
  7. Range的学习笔记
  8. Horner法则,MurMurHash
  9. pg加密扩展的安装_PHP7安装已废弃的对称加密扩展mcrypt记录
  10. 高负载高并发网站架构分析
  11. 综合评价与决策方法02——模糊综合评判法
  12. grep正则表达式后面的单引号和双引号的区别?
  13. 国产手机会使用鸿蒙,小米等国产手机会使用鸿蒙系统吗?
  14. sb 讲解 (!(~+[])+{})[--[~+][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
  15. 鼠标式光流传感器与多传感器融合
  16. 在springboot中导入spring-web相关包导致的错误经验(一)
  17. 蜗牛君漫聊设计模式---建造者模式
  18. 视频教程-React 全家桶从入门到实战到源码-其他
  19. uniapp吸顶功能实现
  20. 归一化处理的目的和意义及其MATLAB方法

热门文章

  1. 英飞凌TC387学习
  2. 运用css+html制作简单的淘宝轮播案例图
  3. 制作类似于淘宝点击简单的轮播图
  4. linux中nginx启动,重启,关闭命令
  5. 2022年最新crm管理系统免费试用-从0了解crm
  6. java实现图片上传至本地
  7. html表格背景颜色
  8. 阿拉伯数字跟中文汉字互转js
  9. 什么服务器适合搭建APP
  10. Java中日志的使用