针对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-------