在Android源码中查找Java代码中native函数对应的C++实现
2014-12-18 18:05
1721 查看
Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码:
如何根据方法名找到其对应的C++实现,有两个方法。
先来个java代码的示例VMThread.java:
我们要查找currentThread方法的实现。
方法一:
由于Android源码中对每个native实现都会写一个java方法名和C++方法名映射的列表,所以我们直接搜索这个列表内容即可。
zkw@zkw $ 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这个文件可以看到:
源码中第242行找到对应的名字,用红色标出,其实现就在第44行。
这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。
方法二:
还是找VMThread.java的currentThread函数,找多了会发现,C++的名字一般都是包名+类名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。
grep -rns "java_lang_VMThread_currentThread" ./*
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++方法名映射的列表,所以我们直接搜索这个列表内容即可。
zkw@zkw $ 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这个文件可以看到:
/* * java.lang.VMThread */ #include "Dalvik.h" #include "native/InternalNativePriv.h" /* * static void create(Thread t, long stacksize) * * This is eventually called as a result of Thread.start(). * * Throws an exception on failure. */ static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult) { Object* threadObj = (Object*) args[0]; s8 stackSize = GET_ARG_LONG(args, 1); /* copying collector will pin threadObj for us since it was an argument */ dvmCreateInterpThread(threadObj, (int) stackSize); RETURN_VOID(); } /* * static Thread currentThread() */ static void Dalvik_java_lang_VMThread_currentThread(const u4* args, JValue* pResult) { UNUSED_PARAMETER(args); RETURN_PTR(dvmThreadSelf()->threadObj); } ...... const DalvikNativeMethod dvm_java_lang_VMThread[] = { { "create", "(Ljava/lang/Thread;J)V", Dalvik_java_lang_VMThread_create }, { "currentThread", "()Ljava/lang/Thread;", Dalvik_java_lang_VMThread_currentThread }, { "getStatus", "()I", Dalvik_java_lang_VMThread_getStatus }, { "holdsLock", "(Ljava/lang/Object;)Z", Dalvik_java_lang_VMThread_holdsLock }, { "interrupt", "()V", Dalvik_java_lang_VMThread_interrupt }, { "interrupted", "()Z", Dalvik_java_lang_VMThread_interrupted }, { "isInterrupted", "()Z", Dalvik_java_lang_VMThread_isInterrupted }, { "nameChanged", "(Ljava/lang/String;)V", Dalvik_java_lang_VMThread_nameChanged }, { "setPriority", "(I)V", Dalvik_java_lang_VMThread_setPriority }, { "sleep", "(JI)V", Dalvik_java_lang_VMThread_sleep }, { "yield", "()V", Dalvik_java_lang_VMThread_yield }, { NULL, NULL, NULL }, };
源码中第242行找到对应的名字,用红色标出,其实现就在第44行。
这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。
方法二:
还是找VMThread.java的currentThread函数,找多了会发现,C++的名字一般都是包名+类名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。
grep -rns "java_lang_VMThread_currentThread" ./*
相关文章推荐
- 如何在Android源码里查找Java中native方法对应的C++实现
- JNI NDK (AndroidStudio+CMake )实现Java调用C C++代码流程
- JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
- Linux环境下android平台调试native代码, 从java debug 到C++ (NDK DEBUG)
- android 代码开源社区连接,可以去查找想要的源码
- android动态布局:用java代码实现LinearLayout以及TextView
- 【转】android截屏代码:C++实现
- android 系统重启与关机:java 代码实现
- 动态查找之二叉排序树,C++代码实现
- android截屏代码:C++实现
- Android中WebView载入本地HTML代码并实现Java与JavaScript交互的例子
- 收集Android里xml配置属性在java代码里的实现
- android apk反编译到java源码的实现方法
- 在JAVA中实现C++代码的复用
- [转]eclipse取代SourceInsight查看android源码(jni c++ java并存)
- android1.5---2.1实现js调摄像头,调Java代码
- Android中WebView载入本地HTML代码并实现Java与JavaScript交互
- 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
- 在Android上使用LocalSocket实现上层Java和底层C++的通信
- android 横屏竖屏设置的详解(最好不要用Java代码实现,用xml配置文件吧)