您的位置:首页 > 移动开发 > Android开发

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

2014-12-18 18:05 1721 查看
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++方法名映射的列表,所以我们直接搜索这个列表内容即可。

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" ./*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: