Java Yerel Erişimi - Java Native Access
| Orijinal yazar(lar) | Todd Hızlı, Timothy Wall, Liang Chen |
|---|---|
| İlk sürüm | 9 Mayıs 2007 |
| kararlı sürüm | 5.8.0 / 22 Mart 2021
|
| 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 |
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
- Java Yerel Erişim Web Sayfası
- Java Yerel Erişimi - İndirme sayfası
- Java Yerel Erişimi - Kullanıcı Posta Listesi
- Friesen, Jeff (5 Şubat 2008). "Açık kaynak Java projeleri: Java Native Access" . Açık Kaynak Java Eğitimleri. JavaWorld . 2020-07-27 alındı .
- Morris, Stephen B. (20 Mayıs 2009). "JNA ile Eski Kod Yatırımınızı Koruyun" . bugün.java.net . Arşivlenmiş orijinal 2015-01-13 tarihinde.
- Dasgupta, Sanjay (11 Kasım 2009). "JNA ile Yerel Kod Erişimini Basitleştirin" . bugün.java.net . Arşivlenmiş orijinal 2009-11-15 tarihinde.
- Doubrovkine, Daniel (20 Haziran 2011). "JNA artık bir Githubber" . code.dblock.org . 2020-07-27 alındı .
- Kiaer, Jesper (21 Mart 2010). "JNA ile Lotus Domino C-API'yi Çağırma" . Nevermind.dk . 2020-07-27 alındı .