Red de conocimiento informático - Material del sitio web - Cómo encontrar la implementación C++ de métodos nativos de Java en el código fuente de Android

Cómo encontrar la implementación C++ de métodos nativos de Java en el código fuente de Android

Cómo encontrar la implementación C++ de un método nativo de Java en el código fuente de Android

Busque globalmente en el marco el nombre completo del método nativo. Mire los archivos coincidentes uno por uno y podrá encontrar lo que está buscando. Existe un patrón de nomenclatura común y la mayoría de los métodos jni se encuentran en el directorio \frameworks\base\core\jni

En el código fuente de Android, hay muchos métodos que utilizan el mecanismo Jni para llamar al C++ subyacente. implementación, como en el conocido Binder.java, hay public static final nativo int getCallingPid(); public static final nativo int getCallingUid(); public static final nativo long clearCallingIdentity(); otros métodos se llaman directamente métodos implementados en C ++; . Puede encontrar rápidamente la implementación correspondiente usando el siguiente comando. build/envsetup cgrep ./frameworks '"getCallingPid"' encontrará los siguientes resultados: Puede encontrar la implementación en C++ de android_os_Binder_getCallingPid y buscar la implementación de este método en el archivo.

El código fuente de Android contiene solo el código del cliente para la aplicación de Android java.

La parte nativa puede existir o no, busque globalmente archivos .c o .cpp primero y solo si existen.

Si se trata de un proyecto de soporte nativo estándar de Android, cuando lo abra en eclipse, encontrará el código C++ nativo en el directorio del proyecto /jni.

Por ejemplo, si hay un método aaa.bbb.CCC.ddd, entonces el método JNI correspondiente es Java_aaa_bbb_CCC_ddd, y el map gun lo buscará. Tenga cuidado de no utilizar coincidencias de campos completos, ya que los nombres JNI también pueden tener sufijos de parámetros.

Además, asegúrate de obtener el código fuente completo de Android y no el código fuente que viene con el SDK, ya que este último solo tiene código Java y no está completo.

El código fuente de Android contiene sólo el código del cliente Java para aplicaciones de Android.

La parte local puede estar disponible o no, así que busque globalmente archivos .c o .cpp.

Si se trata de un proyecto de soporte nativo estándar de Android, cuando lo abra en eclipse, encontrará el código C++ nativo en el directorio del proyecto /jni.

Muchos códigos clave en el código fuente de Android se implementan en C++ y Java los llama a través de jni. A menudo puedes ver un código como este en Java:

hilo nativo estático currentThread();

Hay dos formas de encontrar la implementación de C++ correspondiente según el nombre del método.

Comencemos con el ejemplo de código java de VMThread.java:

paquete java.lang;

clase VMThread {

Hilo de subproceso ;

int vmData;

VMThread (Subproceso t) {

subproceso = t;

}

creación de vacío estático nativo (Thread t, tamaño de pila largo);

hilo nativo estático currentThread();

booleano nativo estático interrumpido();

vacío nativo estático dormir (long msec, int nsec) lanza InterruptedException;

rendimiento vacío nativo estático();

interrupción nula nativa();

booleano nativo isInterrupted() ;

...

}

Buscamos la implementación del método currentThread.

Método 1:

Dado que el código fuente de Android escribe una lista de nombres de métodos de Java y asignaciones de nombres de métodos de C++ para cada implementación local, solo necesitamos buscar el contenido de la lista. Poder.

zkw@zkw $ grep -rns '"currentThread"' ./*

./art/piler/dex/quick/dex_file_method_inliner.:108: "currentThread", kNameCacheCurrentThread

Coincide con el archivo binario ./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: Método método = Thread.class.getMethod(" currentThread ");

./external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTest.java:407: Método método = Thread.class.getMethod("" currentThread");

Como puede ver, busque información relacionada con el método currentThread en el archivo ./dalvik/vm/native/java_lang_VMThread.cpp y luego use ()Ljava/lang/Thread para encontrar el valor de retorno de este método. .

Abra el archivo java_lang_VMThread.cpp, podrá ver:

17 /*

18 * java.lang.VMThread

19 */

20 #incluye "Dalvik.h"

21 # incluye "nativo/InternalNativePriv.h"

22

23

24 /*

25 * creación de vacío estático (hilo t, tamaño de pila largo)

26 */

> 27 * Esto Eventualmente será llamado como resultado de Thread.start().

28 *

29 * Se lanzará una excepción en caso de error.

30 */

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

32 {

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

34 s8 stackSize = GET_ARG_LONG(args,1);

35

36 /* Dado que threadObj es Un parámetro, por lo que el recopilador de copias fijará threadObj por nosotros */

37 dvmCreateInterpThread(threadObj, (int) stackSize);

38 RETURN_VOID(

< p); > 39 }

40

41 /*

42 * Hilo estático currentThread()

43 */

44 static void Dalvik_java_lang_VMThread_ currentThread(const u4* args,

45 JValue* pResult)

46 {

47 UNUSED_PARAMETER(args);

p>

48

49 RETURN_PTR( dvmThreadSelf()->threadObj);

50 }

51

. . ) V",

240 Dalvik _java_lang_VMThread_create },

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

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 { "interrumpido", "()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 { "dormir ", "(JI)V",

258 Dalvik_java_lang_VMThread_sleep },

259 { "rendimiento", "()V",

260 Dalvik_java_lang_VMThread_yield },

261 { NULL, NULL, NULL },

262 };

La línea 242 del código fuente muestra el nombre correspondiente (resaltado en rojo), línea 44 muestra su implementación.

Este método no es muy preciso. Debe confiar en la experiencia para juzgar si el código buscado es lo que está buscando. El siguiente método se puede encontrar con mayor precisión.

Método 2:

O busque la función currentThread de VMThread.java. Si busca más, encontrará que el nombre de C ++ es generalmente el nombre del paquete + el nombre de la clase + el nombre del método. , como el nombre C++ de currentThread debe contener "java_lang_currentThread", "java_lang_currentThread", "java_lang_currentThread" y "java_lang_currentThread". VMThread_currentThread", así que búscalo.

Cómo encontrar referencias de C++ a métodos nativos en Java en el código fuente de Android: :edu.51cto./course/course_id-4377.

Si conoce el nombre del método, conoce el nombre de la función en C++, y el nombre de la función para los métodos nativos comienza con Java_Package_Name_Class_Function. El nombre del paquete debe reemplazarse con .package_name_class_function_name, por ejemplo, en la línea .xxx.yyyy. .ClassA.methodB al lado de C++. Busque Java__xxx_yyyy_ClassA_methodB Cómo ver el código fuente de Android en eclipse

Supongamos que queremos ver el código fuente de la clase Actividad, mantenga presionada la tecla Ctrl y haga clic izquierdo. , pero no podemos ver el código, la información que se muestra es "Archivo Activity.class no encontrado

En este momento, haga clic en el botón "Cambiar fuente adjunta..." y seleccione la ubicación del código. Código fuente de Android, aparecerá un cuadro de diálogo.

El primero es seleccionar el directorio de trabajo, que es el código fuente de la aplicación de Android existente. dos opciones

(1) Seleccionar. Haga clic en el botón Archivo externo... para agregar la ruta al archivo Jar o zip.

(2) Seleccione el archivo externo... para agregar la ruta a la carpeta

La siguiente pregunta Sí, ¿dónde está el código fuente?

Puedes descargar el código fuente a través del Administrador de SDK de Android (método recomendado). , vea el código fuente del SDK de Android y descárguelo.

Además, también puede descargarlo de otras formas. Hay muchos recursos de mierda en Internet.

Aquí elegimos el segundo método (2), seleccionamos el directorio donde se encuentra el código fuente (es decir, la ruta del directorio para descargar el código fuente)

Haga clic en "Aceptar Botón ". , puede ver el código fuente en el archivo de actividad