SORU
27 ŞUBAT 2015, Cuma


Neden BOYUTU değişmeyen tek şey @Tamsayı için Yerli ve Uzun mu?

@Native annotation kullanımı anlıyorum.

Alan sabit bir değer tanımlama başvurulan olabileceğini gösterir yerel kod. Ek açıklama araçları tarafından bir ipucu olarak kullanılabilir yerli başlık oluşturmak üstbilgi dosyası olup olmadığını belirlemek için dosyaları gerekli, ve bu yüzden, ne olursa bildirimleri içermelidir.

Ancak, okurken java kaynak kodu fark ettim ki sınıf Integer Long SIZE sürekli @Native süre değildir Kaydır, Byte, Double, Kısa ve Karakter.

BOYUTU sabit bit gerçek değerini temsil etmek için kullanılan sayısını gösterir unutmayın.

public static final int SIZE = 8;//Byte
public static final int SIZE = 16;//Character
public static final int SIZE = 16;//Short
public static final int SIZE = 32;//Float
@Native public static final int SIZE = 32;//Integer
@Native public static final int SIZE = 64;//Long
public static final int SIZE = 64;//Double

Düzenleme :Sadece bu da MAX_VALUE ve aynı sınıfları MIN_VALUE için geçerli olduğunu fark ettim.


Edit 2 :Zaman bu konuda araştırma yapmak için boşluk, ve Uzun, Şamandıra vb üstbilgi dosyalarına bakarak geçirdim. vardı sınıflar, sabitler diğer başlıkları mevcut değil anlamak için umut, ama ne yazık ki onlar.

static const jint SIZE = 8L;//java/lang/Byte.h
static const jint SIZE = 16L;//java/lang/Character.h
static const jint SIZE = 16L;//java/lang/Short.h
static const jint SIZE = 32L;//java/lang/Float.h
static const jint SIZE = 32L;//java/lang/Integer.h
static const jint SIZE = 64L;//java/lang/Double.h
static const jint SIZE = 64L;//java/lang/Long.h

Neden BOYUTU değişmeyen tek şey @Tamsayı için Yerli ve Uzun mu ?

CEVAP
4 Mart 2015, ÇARŞAMBA


TLDR: Sonuca atlama


Neden BOYUTU değişmeyen tek şey @Tamsayı için Yerli ve Uzun mu?

@Native kısa bir tarihçesi

E-posta listelerinde bazı arama yaptım. Bazı ilginç şeyler buldum.

İlk baştaek açıklama (1 2) javax.tools.annotation.ForceNativeHeader oldu tanıttı

tetiklemek için bir sınıf javah.

com.sun.tools.javac.processing.NativeapiVisitor tarafından kullanılır. Kod bakarak ana başlık ... sınıftaki bazı doğal yöntemleri bildirmek oluşturulan veya sınıf @ForceNativeHeader açıklamalı olup olmadığına bakabiliriz.

Daha sonrabu açıklamaGenerateNativeHeader (1 2)değiştirildi.

Sonraİlginç bir yorum: this annotation was added to several types (özellikle Integer 74*)

/* No native methods here, but the constants are needed in the supporting JNI code */
@GenerateNativeHeader
public final class Long extends Number implements Comparable<Long> {...

Amabu ek açıklama ekleyerek modülü içeren javax temel modülden a problematic dependency ekleyin.araçlar. Ek açıklama Integer Long çıkarıldı ve bu dosyalar açıkça başlığındaki artık otomatik olarak oluşturulan bu yana... "(hopefully temporary) hack" added to the build process.

Bu yüzdenyeni not 27* was created * Integer Long kullanılır. Ek açıklama TargetType FIELD bir set oldu.

açıklama, bir bütün olarak sınıf için ihraç edilmesi gereken sabit alanlar için değil, doğrudan uygulanmalıdır.


Bunları amacı budur:

javac sınıflar doğal yöntemleri içeren doğal başlıklarını oluşturabilir.

Integer Long de durum aynıdır

bu JEP 139: Enhance javac to Improve Build Speed bir parçasıydı:

javah otomatik olarak doğal yöntemleri içeren herhangi bir sınıf üzerinde çalışacak ve üretilen C-headers koymak olacak (h) headerdir. Yeni not @ForceNativeHeader JNI, ancak yerel yöntemler ihraç edilmesi gereken nihai statik ilkel olduğu dersleri için kullanılır.


Temel bir deney

Bu FIRSATLAR üzerinde temel bir deney yaptım. Açık olduğunu gördüm ormanı ben klon ve ben başarılı bir şekilde inşa. Beklendiği gibi başlık dosyaları üretilen Integer Long (teşekkürler için @Native) ve Float Double (sayesinde kendi doğal yöntemleri) ama değil Byte, Short...

    ls -l build/macosx-x86_64-normal-server-release/support/headers/java.base/java_lang_*
    ...
    java_lang_Double.h
    java_lang_Float.h
    java_lang_Integer.h
    java_lang_Long.h
    java_lang_Object.h
    java_lang_Package.h
    ...

Sonra Integer alanlar @Native kaldırma denedim ve yine jdk kurmaya çalıştım ama bir hata alıyorum:

jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c:35:10: fatal error: 'java_lang_Integer.h' file not found
#include "java_lang_Integer.h"
         ^
1 error generated.

Başlığı oluşturulan değil, çünkü bu mantıklı.

Ayrıca java_lang_Integer.h dahil olduğunu teyit ettimc ve cpp birkaç dosya:

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Integer.h" {} \; -print
#include "java_lang_Integer.h"
./jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c
#include "java_lang_Integer.h"
./jdk/src/java.base/unix/native/libnio/ch/IOUtil.c
#include "java_lang_Integer.h"
./jdk/src/java.base/windows/native/libnet/TwoStacksPlainSocketImpl.c
#include "java_lang_Integer.h"
./jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c
#include <java_lang_Integer.h>
./jdk/src/java.desktop/windows/native/libawt/windows/awt_Frame.cpp

Long gibi

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Long.h" {} \; -print
#include "java_lang_Long.h"
./jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c

Float gibi

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Float.h" {} \; -print
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/Float.c
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/ObjectInputStream.c
#include "java_lang_Float.h"
./jdk/src/java.base/share/native/libjava/ObjectOutputStream.c

ve gibi Double

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Double.h" {} \; -print
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/Double.c
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/ObjectInputStream.c
#include "java_lang_Double.h"
./jdk/src/java.base/share/native/libjava/ObjectOutputStream.c

ama ne Short

find .  \( -name "*.c" -o -name "*.cpp" \) -exec grep "java_lang_Short.h" {} \; -print

ne Byte ne Character.


Sonuç

Tüm bu türler arasındasadeceInteger, , *, *58LongFloat bu kullanılanyerel kaynak kod olduğunu gördüm.

Integer Long sadece alanları ile açıklamalı@Nativeçünkü onlaryerel yöntemleriFloat Double (karşıt olarak)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006
  • Murray Winiata

    Murray Winia

    2 ŞUBAT 2009
  • nigahiga

    nigahiga

    21 Temmuz 2006