當前位置:編程學習大全網 - 源碼下載 - 如何在Android源碼裏查找Java中native方法對應的C++實現

如何在Android源碼裏查找Java中native方法對應的C++實現

如何在Android源碼裏查找Java中native方法對應的C++實現

在framework下全局搜索這個native方法的全名。壹個個查看匹配的文件,應該會找到妳需要的。壹般命名都有規律,大部分jni方法都在 \frameworks\base\core\jni目錄

在Android源碼裏,有許多方法都是使用Jni機制調用底層的C++實現,比如大家都很熟悉的Binder.java裏,就有 public static final native int getCallingPid(); public static final native int getCallingUid(); public static final native long clearCallingIdentity(); 等方法都是直接調用C++裏的實現。 通過下面命令可以很快找到對應的實現, . build/envsetup cgrep ./frameworks '"getCallingPid"' 這時會查找到如下結果: 這樣就可以知道對應的C++實現方法名字為android_os_Binder_getCallingPid, 在該文件中找這個方法的實現即可。

android源碼只包含android app java的客戶端代碼。

native部分可能有可能沒有,先全局搜索.c或者.cpp文件,有這些文件才可能有。

如果是標準的android native support 工程,那麽eclipse裏面打開之後,在工程目錄/jni下面就是 native的C++代碼。

比如有方法aaa.bbb.CCC.ddd,JNI對應的名字就是Java_aaa_bbb_CCC_ddd,地圖炮搜索就是了,註意不要用全字段匹配,因為JNI名可能還帶參數後綴。

另外妳的確定妳是下的整套Android系統的源碼,不是SDK附帶的那個源碼,那個只有Java的而且還不全。

android源碼只包含android app java的客戶端代碼。

native部分可能有可能沒有,先全局搜索.c或者.cpp文件,有這些文件才可能有。

如果是標準的android native support 工程,那麽eclipse裏面打開之後,在工程目錄/jni下面就是 native的C++代碼。

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/piler/dex/quick/dex_file_method_inliner.: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/testsgoogle/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread");

./external/android-mock/testsgoogle/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這個文件可以看到:

17 /*

18 * java.lang.VMThread

19 */

20 #include "Dalvik.h"

21 #include "native/InternalNativePriv.h"

22

23

24 /*

25 * static void create(Thread t, long stacksize)

26 *

27 * This is eventually called as a result of Thread.start().

28 *

29 * Throws an exception on failure.

30 */

31 static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)

32 {

33 Object* threadObj = (Object*) args[0];

34 s8 stackSize = GET_ARG_LONG(args, 1);

35

36 /* copying collector will pin threadObj for us since it was an argument */

37 dvmCreateInterpThread(threadObj, (int) stackSize);

38 RETURN_VOID();

39 }

40

41 /*

42 * static Thread currentThread()

43 */

44 static void Dalvik_java_lang_VMThread_currentThread(const u4* args,

45 JValue* pResult)

46 {

47 UNUSED_PARAMETER(args);

48

49 RETURN_PTR(dvmThreadSelf()->threadObj);

50 }

51

......

237

238 const DalvikNativeMethod dvm_java_lang_VMThread[] = {

239 { "create", "(Ljava/lang/Thread;J)V",

240 Dalvik_java_lang_VMThread_create },

241 { "currentThread", "()Ljava/lang/Thread;",

242 Dalvik_java_lang_VMThread_currentThread },

243 { "getStatus", "()I",

244 Dalvik_java_lang_VMThread_getStatus },

245 { "holdsLock", "(Ljava/lang/Object;)Z",

246 Dalvik_java_lang_VMThread_holdsLock },

247 { "interrupt", "()V",

248 Dalvik_java_lang_VMThread_interrupt },

249 { "interrupted", "()Z",

250 Dalvik_java_lang_VMThread_interrupted },

251 { "isInterrupted", "()Z",

252 Dalvik_java_lang_VMThread_isInterrupted },

253 { "nameChanged", "(Ljava/lang/String;)V",

254 Dalvik_java_lang_VMThread_nameChanged },

255 { "setPriority", "(I)V",

256 Dalvik_java_lang_VMThread_setPriority },

257 { "sleep", "(JI)V",

258 Dalvik_java_lang_VMThread_sleep },

259 { "yield", "()V",

260 Dalvik_java_lang_VMThread_yield },

261 { NULL, NULL, NULL },

262 };

源碼中第242行找到對應的名字,用紅色標出,其實現就在第44行。

這個方法不是很準確,要靠經驗來判斷搜出來的代碼是否是自己要找的,下壹個方法可以較準確的查找。

方法二:

還是找VMThread.java的currentThread函數,找多了會發現,C++的名字壹般都是包名+類名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。

如何在Android源碼裏查找Java中native方法對應的C++參考::edu.51cto./course/course_id-4377.

知道方法名就知道C++裏的函數名了,native方法的函數名是 Java_包名_類名_函數名 開頭的,包名要把.換成_。比如.xxx.yyy.ClassA.methodB在C++那邊找Java__xxx_yyy_ClassA_methodB就行了

如何在eclipse中查看android源碼

假設我們想參看Activity類的源代碼,按著Ctrl鍵,左擊它,現實的結果卻看不到代碼的,提示的信息便是“找不到Activity.class文件”。

此時點擊下面的按鈕,“Change Attached Source…”,選擇android源代碼所在位置,便彈出對話框。

第壹種是選擇工作目錄,即已經存在的android應用程序源代碼。

第二種分兩種方式

(1)選擇External File…按鈕,添加Jar格式文件或者zip格式文件路徑;

(2)選擇External Floder…按鈕,添加文件夾所在路徑。

下面問題就來了,源代碼在哪裏?不能憑空產生阿。

可以通過Android SDK Manager進行源代碼下載;(推薦該種方法),勾選Source for Android SDK,進行下載即可。

此外也可通過其他途徑下載,網上有很多***享的資源。

這裏選擇第二種方式的(2)方法,選擇源碼所在目錄(即下載源代碼目錄所在路徑)

點擊“OK”按鈕,此時,Activity文件便能夠查看源代碼了

  • 上一篇:宜賓學院怎麽樣?
  • 下一篇:汽車修理名稱大全汽車修理名稱
  • copyright 2024編程學習大全網