2012-09-26 8 views
16

Javaネイティブメソッドのソースコードはどこでダウンロードできますか?たとえば、私はSystem.arraycopy()のソースコードを知りたいが、見つけられない。Javaネイティブメソッドのソースコード

+2

ネイティブメソッドと、使用している仮想マシンによって異なる方法で実装。実際には、異なるアーキテクチャやVM上で異なるコードが実行される可能性があります。 – epsalon

+0

@epsalon私はこの答えの資格があると思います:) – eis

+0

Open-JDKにはこのソースコードが含まれていますか?これらのネイティブソースコードを見たいと思っています。ソースコード、ありがとう – Jack

答えて

25

OpenJdkのソースコードhereをダウンロードできます。

jdk\src\shareというフォルダには、ソースコードがあります。

jdk\src\share\nativeは、cおよびC++でのnaticeメソッドsouceの書き込みです。

  1. jdk\src\linux source for linux。
  2. jdk\src\windowsウィンドウのソース。
  3. jdk\src\solaris solarisのためのsouce。
  4. jd\src\share一般的な情報源です。

例:System.arrayCopy();

int型のファイルhotspot\src\share\vm\oops\objArrayKlass.cpp行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

私は、例えば、ソースがSystem.arraycopy()そこにいるだろう。私は 'openjdk \ jdk \ src \ share \ native \ java \ lang \ System.c'のパッケージを見ています。情報を持たずにヘッダファイル' java_lang_System.h'をインクルードするだけです。それはそこにあります? – eis

+0

@eisは上記に更新されました。アップデートのために – lichengwu

+0

upvoted、ありがとう! – eis

0

ネイティブメソッドとは、使用している仮想マシンによって異なる方法で実装されています。実際には、異なるアーキテクチャやVM上で異なるコードが実行される可能性があります。

関連する問題