2012-09-26 16 views
16

Gdzie mogę pobrać kod źródłowy metody macierzystej java? Na przykład chcę znać kod źródłowy System.arraycopy(), ale nie mogę go znaleźć.Kod źródłowy metody macierzystej Java

+2

metody Native i realizowane w różny sposób przez Virtual Machine, którego używasz. Nie ma jednej implementacji tej metody, a w rzeczywistości inny kod może być wykonany na różnych architekturach lub maszynach wirtualnych. – epsalon

+0

@epsalon Myślę, że kwalifikuje się jako odpowiedź na to :) – eis

+0

Czy Open-JDK może mieć ten kod źródłowy? Jestem bardzo pożądany chcę mieć wygląd tego natywnego kodu źródłowego, myślę, że powinny to być C/C++ kod źródłowy, Dzięki – Jack

Odpowiedz

25

Możesz pobrać kod źródłowy OpenJdk here.

W folderze jdk\src\share można uzyskać kod źródłowy.

jdk\src\share\native to natice method souce write in c i C++.

  1. jdk\src\linux źródło dla systemu Linux.
  2. jdk\src\windows źródło dla systemu Windows.
  3. souce for solaris.
  4. jd\src\share wspólne źródło.

np .: System.arrayCopy();

int plik hotspot\src\share\vm\oops\objArrayKlass.cpp Linia 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

Nie jestem pewien, czy to źródło na przykład System.arraycopy() będzie tam. Patrzę na pakiet w 'openjdk \ jdk \ src \ share \ native \ java \ lang \ System.c', a zawiera on tylko plik nagłówkowy' java_lang_System.h' bez informacji, więc jesteś pewien jest tutaj? – eis

+0

@to zaktualizowano powyżej. – lichengwu

+0

przegłosowano dla aktualizacji, dzięki! – eis

0

Metody macierzyste i zaimplementowane inaczej przez maszynę wirtualną, z której korzystasz. Nie ma jednej implementacji tej metody, a w rzeczywistości inny kod może być wykonany na różnych architekturach lub maszynach wirtualnych.