Linux İşletim Sistemi Altında Bileşen Tabanlı Yazılım Geliştirmeye Olanak Sağlayan XCOM Sistemi İçin Java Desteği Ahmet Mutlu
İçerik Bileşen Teknolojisi XCOM Sistemi Java Programlama Dili Java Native Interface (JNI) Java – XCOM Köprüsü
Yazılım Nesnesi Nedir? Yapabileceği işlevleri (yöntemler – methods) ve bu işlevler için bulunduğu durum (veri üyesi – data member) bilgisini içeren yazılım parçasıdır. Diğer bir değişle nesne, bir veri yapısı ve bu veri yapısını işleyen işlevler bütünüdür.
Bileşen Nesne Modeli (Component Object Model) Bileşen nesneleri oluşturabilmek ve kullanabilmek için Microsoft tarafından ortaya konulan bir modeldir. Açık bir standarttır ve en alt düzeyden en üst düzeye kadar belgelenmiştir.
Örnek Bir Yazılım Nesnesi : Stack class Stack { int num_; // Yığıttaki eleman sayısı int stack_[MAX];// Yığıt için bellek alanı int sp_; // Yığıt göstergesi public: Stack(); ~Stack(void); void push(int elem) const; int pop(void) const; void clear(void) const; int numElem(void) const; int topElem(void) const; }
IStack Arabirimi interface IStack { void push(in long elem); long pop(void); void clear(void); long numElem(void); }
IStack2 Arabirimi interface IStack2 { long topElem(void); }
Nesne ve Desteklediği Arabirimler
XCOM Linux işletim sistemi altında bileşen tabanlı yazılım geliştirmeye olanak sağlayanü, Microsoft COM benzeri bir sistemdir. İki kesimden oluşur: Programlama dilinden bağımsız ikili bileşen standardı İkili biçime uygun bileşenlerin C++ dili ile oluşturulabilmesine ve kullanılabilmesine olanak tanıyacak araçlar ve yazılım kütüphanesi
XCOM İkili Biçimi – Sayısal Veri Türleri XCOM İkili Biçimi – Sayısal Veri Türleri IDL Adı Tür Boy XCOM Türü Java Türü Octet [0,255] tamsayı 1 byte boolean [0,1] Bool Short [-215,215-1] tamsayı 2 short Long [-231,231-1] tamsayı 4 int unsigned short [0,216-1] tamsayı UShort unsigned long [0, 232-1] tamsayı ULong Float IEEE kayan nokta float Double 8 double Longlong [-263,263-1] tamsayı LongLong long
XCOM İkili Biçimi – Karakter Veri Türleri IDL Adı Tür Boy XCOM Türü Java Türü char ISO Latin 1 karakter 1 Char wchar Unicode UCS4 karakter 4 WChar string 0 la sonlandırılmış char disizi 2 String java.lang.String wstring 0 la sonlandırılmış wchar dizisi WString
XCOM İkili Biçimi-Yapısal Veri Türleri IDL Tanımı : struct tarih { short gun,ay,yil; string gun_adi; } XCOM Karşılığı : struct tarih { xcom::Short gun,ay,yil; xcom::Char *gun_adi; } Java Karşılığı : class tarih { public short gun,ay,yil; public String gun_adi; }
Java Sun Microsystems tarafından geliştirilen, özellikle ağ üzerinde çalışan uygulamalar geliştirmeye yönelik ancak çok amaçlı, nesneye yönelik ve eşzamanlı programlamaya da olanak sağlayan bir programlama dilidir
Neden Java ? Platformdan bağımsız Tamamen nesneye yönelik Otomatik bellek yönetimi ve sıkı tür denetimi ile güvenli Kullanımı kolay ve standart
Java Platformu
Java Sınıf Tanımı class tarih { public short gun,ay,yil; public String gun_adi; } Java Derleyicisi tarih t = new tarih() tarih.class
Otomatik Bellek Yönetimi : Garbage Collection Tarih Nesnesi Tarih t = new Tarih(); t Garbage Collector Tarih Nesnesi t = null; t
Java ‘ da Parametre Geçişi Java programlama dilinde yöntemlere parametre geçişi sadece bir şekilde yapılır. Tüm parametreler değerleri kopyalanarak (pass by value) yönteme geçirilir. Nesneler parametre olarak geçirilemez Bir parametrenin değeri ya temel veri türüdür, ya da bir nesneye referanstır
Örnek Parametre Geçişi void method(String s, char c[], float f) { s = s + “123”; c[0] = ‘A’ c[1] = ‘C’; f = 3.14; } void caller() float f = 1.0; String s = “abc”; char c[] = new char[4]; // 4 karakterlik dizi method(s,c,f); // çağırı sonucunda f = 1.0 // s = “abc”, c ={‘A’,’C’,?,?}
Java Yerel Arabirimi (Java Native Interface) JNI, java ortamının en önemli özelliklerinden birisidir. JNI kullanan java programları, C ve C++ ile yazılmıp derlenmiş olan yerel uygulamalarla ve kütüphanelerle (native library) birlikte çalışabilme olanağına sahip olurlar
JNI ‘ nin Rolü
JNI Nerede Kullanılmalı ? Java uygulama geliştirme arabirimi (Application Programming Interface- API) bazı platform-bağımlı özellikleri desteklemiyor olabilir Görevlerarası iletişimin getireceği performans kaybı olmaksızın bir yerel kütüphanenin işlevlerinin kullanılması gerekebilir Zaman kısıtlı bir uygulama parçasının alt düzeyde gerçekleştirilmesi gerekebilir
JNI İşlevlerine Erişim
Java – JNI Temel Veri Türü Eşleştirmesi Java – JNI Temel Veri Türü Eşleştirmesi Java Türü JNI Türü Açıklama boolean jboolean işaretsiz 8-bit byte jbyte işaretli 8-bit char jchar işaretsiz 16-bit short jshort işaretli 16-bit int jint işaretli 32-bit long jlong işaretli 64-bit float jfloat 32-bit kayan ayırımlı double Jdouble 64-bit kayan ayırımlı
Java – JNI Referans Veri Türü Eşleştirmesi Java – JNI Referans Veri Türü Eşleştirmesi
JNI İşlevlerinin Kullanımı class MyClass { private native print(String s); public static void main(String args[]) print(s); } . . . extern “C” Java_MyClass_print(JNIEnv *env,jobject obj,jstring s) { printf(“%s\n”,(char *)env->GetStringUTFChars(s,NULL)); }
Geliştirilen Java – XCOM Köprüsü XCOM bileşenlerini java programcılarının kolaycakullanabilmelerini sağlayacak ara katman modelinden ve bu katmanların otomatik olarak oluşturulmasını sağlayan bir modül
Component Bileşen Nesnesinin C++ Uyarlaması class Component { . . . public: // Verilen harfi büyük harfe dönüştürür void toUpper(xcom::Char *c){ . . . }; // str karakter dizisi içerisinde s karakter dizisinin // ilk bulunduğu yeri döndürür int fastFind(xcom::Char *str, xcom::Char::char *s) { . . . }; } C++ Derleyicisi Component.so Bileşen kütüphanesi
IComponent Arabirimi IDL Tanımı interface IComponent::IUnknown { // Verilen harfi buyuk harfe donusturur void toUpper(in out char c); // str karakter dizisi içerisinde s karakter dizisinin // ilk bulunduğu yeri döndürür long fastFind(in string str, in string s); }
Component Bileşen Nesnesinin Java Uyarlaması class Component { public void toUpper(char c[]) { . . . }; int fastFind(String str, String s); } Java Derleyicisi Component c = new Component(); c.FastFind(“aaaafsdflkjsf”,”flk”); Component.class Java sınıfı
IDL Derleyicisi Tarafından Oluşturulan IComponent.java Arabirimi class IComponent extends IUnknown { private native int iPtr; private native int initNative() private native void toUpperNative(int iPtr,char[] c); private native int fastFindNative(int iPtr,String str,String s); public void toUpper(char[] c) toUpperNative(iPtr,c); } public int fastFind(String str, String s) return fastFindNative(iPtr,str,s); static { System.loadLibrary(“WrapperIComponent”);} . . .
IDL Derleyicisi Tarafından Oluşturulan libWrapperIComponent IDL Derleyicisi Tarafından Oluşturulan libWrapperIComponent.cpp Ara Kütüphanesi void Java_IComponent_toUpperNative(. . .,jcharArray c) { . . . Char *c_ = (Char *) env->GetCharArrayElements(c_,NULL); // XCOM Bileşen arabirimine yönlendirme iPtr_->toUpper(c_[0]); // Bileşen arabirimine yönlendirme env->ReleaseCharArrayElements(c,c_,NULL); } jint Java_IComponent_fastFindNative(. . .,jstring str,jstring s) { . . . Char *str_ = (Char *) env->GetStringUTFChars(str); Char *s_ = (Char *) env->GetStringUTFChars(s); // XCOM Bileşen arabirimine yönlendirme return (jint) iPtr_->findFast(str_,s); }
Java Uygulaması . . . IComponent.class libWrapperIComponent.so IComponent ic = new IComponent(); c.fastFind(“aaaafsdflkjsf”,”flk”); . . . IComponent.class int fastFind(String str,String s) { return findFastNative(str,s) } libWrapperIComponent.so jint Java_IComponent_findFastNative(. . .,jstring str, jstring s) { . . . Char *str_ = (Char *) env->GetStringUTFChars(str); Char *s_ = (Char *) env->GetStringUTFChars(s); return (jint) iPtr_->findFast(str,s) } IComponent Arabirimi Component.so int findFast(Char *str, Char *s) {. . .}
IDL Derleyicisi IDL tanımları verilen arabirim ve veri türü tanımlarından uygun java arabirimi ve C++ ara kütüphanesini otomatik olarak oluşturur OMG’nin (Object Management Group) belirlediği CORBA IDL belirtim dilinin bir alt kümesini desteklemektedir. omniORB adlı açık kaynak kodlu bir proje için geliştirilmiş olan IDL derleyicisine arka modül eklenmiştir.
Diğer Sistemler Microsoft SDK For Java JACOB (Java-COM Bridge)