Java'nın Yabancı İşlev ve Bellek (FFM) API'si, paylaşılan bir kitaplıktaki koda veya C veya Rust gibi bir programlama dilinde yazılmış DLL'ye erişmek için kullanılır. Ancak kodun bazı gereksinimleri karşılaması gerekir. Bu üç bölümlük makale serisi, bir Java uygulamasının kütüphanenin işlevlerini nasıl çağırdığını, hangi hazırlıkların gerekli olduğunu ve hangi kurallara uyulması gerektiğini göstermek için C dilinde yazılmış bir demo kütüphaneyi kullanır. Makalelerde, ortak “paylaşılan kitaplık” terimi, Unix ve Windows DLL altında paylaşılan bir kitaplığı ifade eder.
Duyurudan sonra devamını okuyun
Rudolf Ziegaus bir yazılım geliştiricisi, Java eğitmeni ve IO Software GmbH'nin CEO'sudur. En sevdiği konular PKi, kriptografi ve düşük seviyeli programlamadır.
FFM ile çalışmanın başlangıç noktası, Java aracılığıyla bir donanım güvenlik modülüne (HSM) erişmenin bir yolunu aramamdı. Henüz fiziksel bir HSM olmadığından yazılım destekli bir uygulama aradım. SoftHSM2 uygulamasına PKCS11 ile erişilebilir ancak Sun'ın Pkcs#11 sürücüsü eskidir. Uygun bir açık kaynak uygulama bulamadığım için Java için FFM API'sini temel alan bir PKCS11 sarmalayıcı geliştirdim.
Proje çok büyük olduğundan bu üç bölümlük makale dizisi, FFM API kavramlarını açıklamaya hizmet eden, özel olarak geliştirilmiş bir C kütüphanesine odaklanıyor. Küçük demo kütüphanesi Windows ve Linux'ta test edilmiştir.
Küçük bir tarih
Java'da, FFM'den önce, Java Yerel Arayüzünü (JNI) kullanarak C ile yazılmış koda erişmenin bir yolu uzun süredir vardı. Ancak JNI çok karmaşıktı ve hataya açıktı.
Bu nedenle JDK 14'te (Java Development Kit) yeni bir arayüz olan Yabancı Fonksiyon ve Bellek API'si üzerinde çalışmalara başlandı. Java topluluğu bunu birkaç JDK ve JEP sürümünde geliştirdi ve sonunda JDK 22'de sonlandırdı. Ancak JDK 24'te farklı bir biçimde tekrar göründü. Bazı önemli değişiklikler nedeniyle Java 24 API, Java 22 API ile uyumlu değil. Bu makalede JDK 24'ün güncel sürümü açıklanmaktadır.
Duyurudan sonra devamını okuyun
FFM API'yi kullanmak için aşağıdaki gereksinimler geçerlidir:
- JDK sürüm 24 veya üzerini yüklemelisiniz.
- İşletim sistemi Windows veya x64 tabanlı Linux olmalıdır. Demo uygulamasının macOS'ta da çalışması gerekiyor ancak herhangi bir test yapmadım.
- 64 bit versiyonda Linux için mutlaka Windows DLL veya paylaşımlı kütüphane bulunmalıdır.
- DLL veya paylaşılan kitaplık, C-ABI'yi (Uygulama İkili Arayüzü) destekleyen bir dilde yazılmalıdır. C ve C++'a ek olarak (uygun şekilde bildirilen işlevlerle), Rust ve Go gibi diğer diller de buna dahildir.
- Paylaşılan kitaplığa erişirken yerel erişime izin vermelisiniz. Bu şu anda Java'nın daha sonraki bir sürümünde değişebilecek herhangi bir kısıtlama olmaksızın mümkündür.
DemoLib'in açıklaması
FFM'nin başlangıç noktası her zaman C'deki paylaşılan kitaplığın işlevlerini ve muhtemelen türlerini açıklayan bir başlık dosyasıdır.
C'de geliştirilen örnek kütüphane yalnızca birkaç fonksiyon ve bir veri tipi içerir:
#ifdef _WIN32
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
typedef struct
{
double x;
double y;
} Point;
#define VERSION 1
EXPORT void initialize(void);
EXPORT int getVersion(void);
EXPORT void getVersion2(int *version);
EXPORT long add(long a, long b);
EXPORT double calcAverage(int *lvalues, int size);
EXPORT double distance(Point *p1, Point *p2);
Yalnızca bir tür tanımı vardır (Point) ve birkaç işlev. Direktif #ifdef başlık dosyasında kodun hem Linux hem de Windows altında derlenebilmesini sağlar.
Aletin takılıp düşme riskiyle bağlanması
jextract aracı yerel işlevlere erişmeye yardımcı olur. Yine başlangıç noktası, paylaşılan kitaplık işlevleri için gerekli erişim yöntemlerini oluşturmaya yönelik bir başlık dosyasıdır.
Ancak jextract çeşitli zorluklarla boğuşuyor. Başlangıçta tüm JDK'lar için mevcut değildir; JDK 22'den sonra yalnızca JDK 25 için kullanılabilir. JDK 22'deki sürüm, makalenin demo kitaplığı için iki sınıf oluşturmuştur: Point veri yapısına erişmek için e DemoLib_hÖzelliklere erişmek için. sınıf Point okunması zor olan yaklaşık 170 satırlık koddan oluşur ve sınıf DemoLib_h okunması zor olan 390 satırlık kod daha var.
Karmaşık başlık dosyaları için jextract'ı kullanmak daha da zordur. PKCS11 için bir sarmalayıcı oluşturmaya çalışırken jextract, JDK 22 ile birlikte çöktü. pkcs11.h başlık dosyası iki ek başlık dosyası yükler. Bu durum, uyumsuz tür yeniden tanımlamalarının varlığını belirten hata mesajlarıyla birlikte bir kesintiye yol açtı.
jextract şu anda yalnızca küçük projeler için kullanılabilir ve bu da kısıtlamalarla mümkündür. Kodun okunması zor olduğundan kodunuz için bir şablon değildir. Bu nedenle en iyi yaklaşım, kodu kendiniz geliştirmek ve onu anlamak için uygun bilgi birikimini edinmektir.

Bir yanıt yazın