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

针对android framework的源码

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

android 6.0 Thread.java
private native void nativeInterrupt();

每一个native方法的C++实现, 都映射为一个C++中的方法名, 映射规则是:
包名_类名_native的方法名.
eg. nativeInterrupt() 对应的C++中的方法名就是: Thread_nativeInterrupt

在http://androidxref.com/6.0.0_r1/,
中的symbol输入框中填入"Thread_nativeInterrupt" 即可查到native方法在C++中的实现在/art/runtime/native/java_lang_Thread.cc中.
注意要区分大小写, 如果填入"thread_nativeinterrupi“是查询不到结果的.

针对chromium的源码

针对chromium项目, 例如Tab.java中的private native int nativeLoadUrl(), 在源码中搜"Tab_nativeLoadUrl"却查询不到.
这是因为需要在out/release目录下搜索, grep -rinI "Tab_nativeLoadUrl" ./ (注意: 不要这样搜关键字, grep -rinI "*Tab_nativeLoadUrl*" ./ 这样是搜不到关键字的.)
这是因为chromium运行一个python文件, 自动生成了文件, 在这个文件中
./gen/chrome/jni/Tab_jni.h

// This file is autogenerated by
//     base/android/jni_generator/jni_generator.py
// For
//     org/chromium/chrome/browser/Tab

jint Java_org_chromium_chrome_browser_Tab_nativeLoadUrl(JNIEnv* env,
    jobject jcaller,
    jlong nativeTabAndroid,
    jstring url,
    jstring extraHeaders,
    jbyteArray postData,
    jint transition,
    jstring referrerUrl,
    jint referrerPolicy,
    jboolean isRendererInitiated,
    jlong intentReceivedTimestamp) {
  TabAndroid* native = reinterpret_cast(nativeTabAndroid);
  CHECK_NATIVE_PTR(env, jcaller, native, "LoadUrl", 0);
  return native->LoadUrl(env, jcaller, url, extraHeaders, postData, transition,
      referrerUrl, referrerPolicy, isRendererInitiated,
      intentReceivedTimestamp);
}

实际上, Tab.java中的native方法的实现, 都是在TabAndroid* native中, 也就是tab_android.cc

实际上, Tab.java中的native方法的实现, 都是在TabAndroid* native中, 也就是tab_android.cc

//tab_android.cc
TabAndroid::TabLoadStatus TabAndroid::LoadUrl(JNIEnv* env,
                                              jobject obj,
                                              jstring url,
                                              jstring j_extra_headers,
                                              jbyteArray j_post_data,
                                              jint page_transition,
                                              jstring j_referrer_url,
                                              jint referrer_policy,
                                              jboolean is_renderer_initiated,
                                              jlong intent_received_timestamp) {

}

---DONE-------

你可能感兴趣的:(Android:源码)