在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<TabAndroid*>(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-------

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值