在Android源码中查找Java代码中native函数对应的C++实现

Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码:

    static native Thread currentThread();

如何根据方法名找到其对应的C++实现,有两个方法。

先来个java代码的示例VMThread.java:

package java.lang;

class VMThread {
    Thread thread;
    int vmData;

    VMThread(Thread t) {
        thread = t;
    }

    native static void create(Thread t, long stackSize);

    static native Thread currentThread();
    static native boolean interrupted();
    static native void sleep (long msec, int nsec) throws InterruptedException;
    static native void yield();

    native void interrupt();

    native boolean isInterrupted();
    ......
}

我们要查找currentThread方法的实现。

方法一:

由于Android源码中对每个native实现都会写一个java方法名和C++方法名映射的列表,所以我们直接搜索这个列表内容即可。

[email protected] $ grep -rns ‘"currentThread"‘ ./*
./art/compiler/dex/quick/dex_file_method_inliner.cc:108:    "currentThread",         // kNameCacheCurrentThread
匹配到二进制文件 ./dalvik/vm/native/.java_lang_VMThread.cpp.swp
./dalvik/vm/native/java_lang_VMThread.cpp:241:    { "currentThread",  "()Ljava/lang/Thread;",
./external/android-mock/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:249:    Method method = Thread.class.getMethod("currentThread");
./external/android-mock/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:407:    Method method = Thread.class.getMethod("currentThread");

可以看到,在文件./dalvik/vm/native/java_lang_VMThread.cpp中找到currentThread方法相关的信息,后面()Ljava/lang/Thread代表这个方法的返回值。

进入java_lang_VMThread.cpp这个文件可以看到:

 17 /*
 18  * java.lang.VMThread
 19  */
 20 #include "Dalvik.h"
 21 #include "native/InternalNativePriv.h"
 22
 23
 24 /*
 25  * static void create(Thread t, long stacksize)
 26  *
 27  * This is eventually called as a result of Thread.start().
 28  *
 29  * Throws an exception on failure.
 30  */
 31 static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)
 32 {
 33     Object* threadObj = (Object*) args[0];
 34     s8 stackSize = GET_ARG_LONG(args, 1);
 35
 36     /* copying collector will pin threadObj for us since it was an argument */
 37     dvmCreateInterpThread(threadObj, (int) stackSize);
 38     RETURN_VOID();
 39 }
 40
 41 /*
 42  * static Thread currentThread()
 43  */
 44 static void Dalvik_java_lang_VMThread_currentThread(const u4* args,
 45     JValue* pResult)
 46 {
 47     UNUSED_PARAMETER(args);
 48
 49     RETURN_PTR(dvmThreadSelf()->threadObj);
 50 }
 51
......237
238 const DalvikNativeMethod dvm_java_lang_VMThread[] = {
239     { "create",         "(Ljava/lang/Thread;J)V",
240         Dalvik_java_lang_VMThread_create },
241     { "currentThread",  "()Ljava/lang/Thread;",
242         Dalvik_java_lang_VMThread_currentThread },
243     { "getStatus",      "()I",
244         Dalvik_java_lang_VMThread_getStatus },
245     { "holdsLock",      "(Ljava/lang/Object;)Z",
246         Dalvik_java_lang_VMThread_holdsLock },
247     { "interrupt",      "()V",
248         Dalvik_java_lang_VMThread_interrupt },
249     { "interrupted",    "()Z",
250         Dalvik_java_lang_VMThread_interrupted },
251     { "isInterrupted",  "()Z",
252         Dalvik_java_lang_VMThread_isInterrupted },
253     { "nameChanged",    "(Ljava/lang/String;)V",
254         Dalvik_java_lang_VMThread_nameChanged },
255     { "setPriority",    "(I)V",
256         Dalvik_java_lang_VMThread_setPriority },
257     { "sleep",          "(JI)V",
258         Dalvik_java_lang_VMThread_sleep },
259     { "yield",          "()V",
260         Dalvik_java_lang_VMThread_yield },
261     { NULL, NULL, NULL },
262 };

源码中第242行找到对应的名字,用红色标出,其实现就在第44行。

这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。

方法二:

还是找VMThread.java的currentThread函数,找多了会发现,C++的名字一般都是包名+类名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。

grep -rns "java_lang_VMThread_currentThread" ./*

时间: 2024-08-02 06:41:06

在Android源码中查找Java代码中native函数对应的C++实现的相关文章

Android源码开发利器——Java源码调试(基于4.1.2)

原文地址:http://blog.csdn.net/jinzhuojun/article/details/8868038 调试Android Java源码 草帽的后花园--Neo 写在之前的话:这里主要是以调试Java源码为主,应该说是在system_process之后的源码,这对于调试和修改frameworks层的人来说真是一个利器,但至于为什么在system_process之后,我还在分析,如果有结果我会更新此文章,并正在尝试调试C++的代码,就是native中的代码,如果这个可行那将会大大

eclipse 4.5.2 源码修改 格式化Java代码

注:本文代码基于eclipse4.5.2 1. 需求:在换电脑之后,如何不用配置eclipse就可以很快进入开发呢,并保持原来的编码规范. 2. 方法:修改eclipse源码 分别修改了两个jar包2个类,源码都是来源于eclipse的plugins下对应jar包,具体如下: Jar包 类名 org.eclipse.core.resources_3.10.1.v20150725-1910.jar org.eclipse.core.internal.resources.PreferenceInit

Android源码-SignApk.java

1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at

在JSP中的java代码中调用js代码

out.println(str)方法就是在JSP服务端运行的时候把str输出到服务端返回给客户端的HTML页面 可以通过out.print()这种方式输出一段JS代码,这段JS代码先声明一个JS函数,声明结束后再调用一下这个方法. 例如: out.println("<script>function showMessage() {alert('set_afterlogin()');}</script>");//声明showMessage方法 out.println

Android 源码分析工具

标 题: [原创]Android源码分析工具及方法作 者: MindMac时 间: 2014-01-02,09:32:35链 接: http://bbs.pediy.com/showthread.php?t=183278 在对 Android 源码进行分析时,如果有得力的工具辅助,会达到事半功倍的效果.本文介绍了一些在分析 Android 源码时使用的一些工具和方法,希望能够帮助到有需要的同学. Eclipse 在 Android 应用程序开发过程中,一般会使用 Eclipse,当然 Googl

阅读源码的重要性:如厨师选食材,耍厨具——在Eclipse中如何查看Java、Android源码

首先,很多人说,不会看jdk中的源码就不叫学过Java.显然这是肯定的.打个比方:真正的厨师需要从食材的选取.加工,到最后的烹饪.装盘成型,甚至到最后给用户介绍食用方法等一整套流程走下来.而实际上很多厨师只是做了其中的一小部分,所以最多也只能叫得上"炒菜的",而不是一个厨师.而很多顶级餐厅强调选材,就是从源头上找到适合做某道菜的原料,甚至是反过来,得到一个供应链供应某种独特食材而专门为该材料设计某种烹饪技术.这就是从头至尾的资源最大化利用,其体现创新及内功的地方贯穿整个流水线!特别的,

访何红辉:谈谈Android源码中的设计模式

最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计模式,以及近期Android开发中的一些热点话题. 受访嘉宾介绍: 何红辉(@MrSimp1e),前友盟Android工程师,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享.Android开源库 AndroidEventBus . Colorful 作者, 开发技术前线 站长,<Android源码

谈谈23种设计模式在Android源码及项目中的应用

本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由MarkDown语法编写,可能不同平台渲染效果不一,如果有存在排版错误图片无法显示等问题,烦请移至个人博客,如果个人博客无法访问可以留言告诉我,转载请声明个人博客出处,谢谢. 前言 本文将结合实际谈谈23种设计模式,每种设计模式涉及 * 定义:抽象化的定义与通俗的描述,尽量说明清楚其含义与应用场景 * 示例:如果项目中有使用过该模式,则会给出项目中的代码,否则会给出尽可能简单好理解的java

Android 源码系列之&lt;十三&gt;从源码的角度深入理解LeakCanary的内存泄露检测机制(中)

转载请注明出处:http://blog.csdn.net/llew2011/article/details/52958563 在上篇文章Android 源码系列之<十二>从源码的角度深入理解LeakCanary的内存泄露检测机制(上)中主要介绍了Java内存分配相关的知识以及在Android开发中可能遇见的各种内存泄露情况并给出了相对应的解决方案,如果你还没有看过上篇文章,建议点击这里阅读一下,这篇文章我将要向大家介绍如何在我们的应用中使用square开源的LeakCanary库来检测应用中出