Java Yerel Erişimi - Java Native Access

Java Yerel Erişimi
Orijinal yazar(lar) Todd Hızlı, Timothy Wall, Liang Chen
İlk sürüm 9 Mayıs 2007 ( 2007-05-09 )
kararlı sürüm
5.8.0 / 22 Mart 2021 ; 5 ay önce ( 2021-03-22 )
depo
Yazılmış C ve Java
İşletim sistemi Windows, macOS, Android, AIX, FreeBSD, Linux , OpenBSD, Solaris, Windows Mobile
platformu Java 1.4 veya üstü (JNA 3.5.2 veya öncesi için), JNA 4.0.0 ve üstü için Java 1.6
Boy 1,83 MB (arşivlenmiş)
Tip Yazılım Kitaplığı
Lisans LGPL sürüm 2.1 veya üzeri ve (sürüm 4.0'dan itibaren) Apache Yazılım Lisansı, sürüm 2.0
İnternet sitesi github .com /java-native-access /jna

Java Yerel Erişimi ( JNA ), Java programlarının Java Yerel Arabirimi (JNI) kullanmadan yerel paylaşılan kitaplıklara kolay erişmesini sağlayan, topluluk tarafından geliştirilmiş bir kitaplıktır . JNA'nın tasarımı, minimum çabayla doğal bir şekilde yerel erişim sağlamayı amaçlar. JNI'den farklı olarak, hiçbir ortak plaka veya oluşturulan tutkal kodu gerekmez.

Mimari

JNA kitaplığı, yerel kodu dinamik olarak çağırmak için yabancı işlev arabirim kitaplığı ( libffi ) adı verilen küçük bir yerel kitaplık kullanır . JNA kitaplığı, kodun bir kitaplığı ada göre yüklemesine ve bu kitaplık içindeki bir işleve bir işaretçi almasına izin veren yerel işlevleri kullanır ve tümü statik bağlamalar , başlık dosyaları veya herhangi bir derleme aşaması olmadan onu çağırmak için libffi kitaplığını kullanır . Geliştirici , hedef yerel kitaplıktaki işlevleri ve yapıları tanımlamak için bir Java arabirimi kullanır . Bu, JNI kodunu yapılandırmanın ve oluşturmanın yüksek geliştirme yüküne maruz kalmadan yerel platform özelliklerinden yararlanmayı oldukça kolaylaştırır .

JNA, macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile ve Android üzerinde oluşturulmuş ve test edilmiştir . Java çalıştıran diğer platformların çoğunda çalışmasını sağlamak için yerel yapı yapılandırmalarını ince ayar yapmak ve yeniden derlemek de mümkündür.

Eşleme türleri

Aşağıdaki tablo, Java ile yerel kod arasındaki ve JNA kitaplığı tarafından desteklenen tür eşlemelerine genel bir bakış gösterir.

Yerel Tür Boy Java Türü Yaygın Windows Türleri
karakter 8 bit tam sayı bayt BYTE, TCHAR
kısa boylu 16 bit tam sayı kısa boylu KELİME
wchar_t 16/32-bit karakter karakter TCHAR
int 32 bit tam sayı int DWORD
int boole değeri boole BOOL
uzun 32/64 bit tam sayı YerliUzun UZUN
uzunca 64 bit tam sayı uzun __int64
batmadan yüzmek 32 bit FP batmadan yüzmek
çift 64 bit FP çift
karakter * C dizesi Sicim LPCSTR
geçersiz* Işaretçi Işaretçi LPVOID, KOL, LPXXX

Not: Bazı önişlemci tanımlarına göre TCHAR'ın anlamı char ve wchar_t arasında değişir. LPCTSTR takip eder.

Veri yapıları için bellek bayt hizalaması

Yerel kitaplıkların standartlaştırılmış bellek baytı hizalama tadı yoktur. JNA, varsayılan olarak, kitaplığa özel bir özel hizalama tarafından geçersiz kılınabilen, işletim sistemi platformuna özel bir ayara sahiptir. Yerel kitaplığın belgelerinde hizalama ayrıntıları verilmemişse, Java sarmalayıcının uygulanması sırasında deneme yanılma yoluyla doğru hizalama belirlenmelidir.

Örnek

Aşağıdaki program, yerel C standart kitaplık uygulamasını yükler ve bunu printf işlevini çağırmak için kullanır .

Not: Aşağıdaki kod taşınabilirdir ve Windows ve POSIX ( GNU + Linux / Unix / macOS ) platformlarında aynı şekilde çalışır .

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of native library declaration and usage. */
public class HelloWorld {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
            (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

Aşağıdaki program C POSIX kitaplığını yükler ve bunu standart mkdir işlevini çağırmak için kullanır .

Not: Aşağıdaki kod taşınabilirdir ve POSIX standart platformlarında aynı şekilde çalışır .

import com.sun.jna.Library;
import com.sun.jna.Native;

/** Simple example of native C POSIX library declaration and usage. */
public class ExampleOfPOSIX {
    public interface POSIX extends Library {
	    public int chmod(String filename, int mode);
	    public int chown(String filename, int user, int group);
	    public int rename(String oldpath, String newpath);
	    public int kill(int pid, int signal);
	    public int link(String oldpath, String newpath);
	    public int mkdir(String path, int mode);
	    public int rmdir(String path);
    }

    public static void main(String[] args) {
        // It is possible to load msvcrt for its partial POSIX support on Windows...
        POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);
        // but it will still fail on Windows due to /tmp being missing.
	    posix.mkdir("/tmp/newdir", 0777);
	    posix.rename("/tmp/newdir","/tmp/renamedir");
    }
}

Aşağıdaki program Kernel32.dll dosyasını yükler ve bunu Beep ve Sleep işlevlerini çağırmak için kullanır .

Not: Aşağıdaki kod yalnızca Windows platformlarında çalışır .

import com.sun.jna.Library;
import com.sun.jna.Native;

/** Simple example of Windows native library declaration and usage. */
public class BeepExample {
    public interface Kernel32 extends Library {
        // FREQUENCY is expressed in hertz and ranges from 37 to 32767
        // DURATION is expressed in milliseconds
        public boolean Beep(int FREQUENCY, int DURATION);
        public void Sleep(int DURATION);
    }

    public static void main(String[] args) {
	    Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
	    lib.Beep(698, 500);
	    lib.Sleep(500);
	    lib.Beep(698, 500);
    }
}

Ayrıca bakınız

Referanslar

Dış bağlantılar