2012-09-26 20 views
16

¿Dónde puedo descargar el código fuente del método nativo de Java? Por ejemplo, quiero saber el código fuente de System.arraycopy(), pero no puedo encontrarlo.Código fuente del método nativo de Java

+2

métodos nativos e implementado de manera diferente por la máquina virtual que esté utilizando. No existe una implementación única de este método, y de hecho, diferentes códigos se pueden ejecutar en diferentes arquitecturas o máquinas virtuales. – epsalon

+0

@epsalon Creo que califica como una respuesta para esto :) – eis

+0

¿Open-JDK puede tener este código fuente? Estoy muy deseoso de tener un vistazo de estos códigos fuente nativos, creo que estos deberían ser C/C++ código fuente, Gracias – Jack

Respuesta

25

Puede descargar el código fuente de OpenJdk here.

En la carpeta jdk\src\share puede obtener el código fuente.

jdk\src\share\native es el método natice souce write en c y C++.

  1. jdk\src\linux fuente para linux.
  2. jdk\src\windows fuente para windows.
  3. jdk\src\solaris souce para solaris.
  4. jd\src\share fuente común.

por ejemplo: System.arrayCopy();

int archivo hotspot\src\share\vm\oops\objArrayKlass.cpp línea 168:

void objArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, 
          int dst_pos, int length, TRAPS) { 
assert(s->is_objArray(), "must be obj array"); 

if (!d->is_objArray()) { 
    THROW(vmSymbols::java_lang_ArrayStoreException()); 
} 

// Check is all offsets and lengths are non negative 
if (src_pos < 0 || dst_pos < 0 || length < 0) { 
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 
} 
// Check if the ranges are valid 
if ((((unsigned int) length + (unsigned int) src_pos) > (unsigned int) s->length()) 
    || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length())) { 
    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 
} 

// Special case. Boundary cases must be checked first 
// This allows the following call: copy_array(s, s.length(), d.length(), 0). 
// This is correct, since the position is supposed to be an 'in between point', i.e., s.length(), 
// points to the right of the last element. 
if (length==0) { 
    return; 
} 
if (UseCompressedOops) { 
    narrowOop* const src = objArrayOop(s)->obj_at_addr<narrowOop>(src_pos); 
    narrowOop* const dst = objArrayOop(d)->obj_at_addr<narrowOop>(dst_pos); 
    do_copy<narrowOop>(s, src, d, dst, length, CHECK); 
} else { 
    oop* const src = objArrayOop(s)->obj_at_addr<oop>(src_pos); 
    oop* const dst = objArrayOop(d)->obj_at_addr<oop>(dst_pos); 
    do_copy<oop> (s, src, d, dst, length, CHECK); 
    } 
} 
+0

No estoy seguro de que la fuente, por ejemplo, System.arraycopy() estaría allí. Estoy mirando el paquete en 'openjdk \ jdk \ src \ share \ native \ java \ lang \ System.c', y solo incluye el archivo de encabezado' java_lang_System.h' sin tener la información, por lo que está seguro ¿está allá? – eis

+0

@eis actualizado arriba. – lichengwu

+0

upvoted para la actualización, ¡gracias! – eis

0

Métodos nativos e implementados de manera diferente por la máquina virtual que está utilizando. No existe una implementación única de este método, y de hecho, diferentes códigos se pueden ejecutar en diferentes arquitecturas o máquinas virtuales.

Cuestiones relacionadas