JNI & JAVA APPLET UYGULAMALARI İLE

SİSTEM KAYNAKLARINA ERİŞİM

 

(Özet)

 

Bu proje ile java appletler içinden C kodları çağırmak suretiyle web üzerinde bir makinenenin sabit diskleri, işlemcisi, işletim sistemi, portları, arka planda çalışan servisleri ve bunlar gibi önemli sistem bilgilerine ulaşmak ve bunları applet arayüzünden kullanıcıya sunmak amaçlanmıştır.  Projede kullanılan en genel yapı JNI (Java Native Interface) olarak adlandırılan ve bir dll içindeki C/C++ fonksiyonlarının java appletler içinde kullanılmasına izin veren bir teknolojiden ibarettir. Elbette JNI teknolojisi sadece C/C++ kodlarının çağrılmasından ibaret değildir. Bunun içine javanın içinde barındırmadığı çağrılar ve alt seviye diller (assembler gibi) yardımıyla javanın ulaşamadığı platforma bağlı bir çok native kodlar da girmektedir.

Proje için asıl istenen javanın kendi içinde barındırdığı metod ve özellikler kullanılarak applet arayüzü ile web üzerinden sistem bilgilerinin kullanıcıya sunulması şeklinde olmasına karşın yapılan araştırmalar ve çalışmalar henüz java appletler ile böyle bir çalışma yapılamayacağını, javanın kendi içinde bu tip metodları barındırmadığını göstermiş ve projenin devamı için farklı teknolojilere geçilmesinde önemli rol oynamıştır. Proje için java ile bağlantılı Pure Java,  J/Direct,  JNI gibi konular incelenmiş ve bunların her biri ile istenen projenin gerçeklenme olasılıkları ortaya konulmuştur. Bütün bu araştırma devresi boyunca denenmiş yollar ileriki bölümlerde anlatılacak ve projenin bitim aşamasına gelene kadar geçilen adımlar ortaya konulup üzerleri vurgulanacaktır.

Projede oluşturulan ve sunucuya yüklenen appletin istemcide çalışması için çeşitli kısıtlamalar vardır. Bu proje şu an için yanlızca Microsoft Windows işletim sitemlerini desteklemektedir. Yazılmış olan applet, doğrudan işletim siteminin komutlarını çağırdığından işletim siteminin çalışma biçimi, genel olarak dinamik kütüphane içindeki fonksiyon ve çağrıların bilinmesi gerekmektedir. Proje kapsamında başlanan nokta ve verilen zaman göz önüne alındığında gelinen noktada bir başka işletim siteminin çalışma şekli için yeterli zaman ve imkan bulunmamaktadır. Fakat bu projenin ileride diğer popüler işletim sistemleri üzerinde de çalışabilecek duruma getirilmesi planlanmaktadır.

Microsoft firmasının 2004 yılı itibariyle javayı desteklemeyeceğini duyurması üzerine proje Sun firmasının derleyicileri ve araçları ile oluşturulmuş olup appletin istemci üzerinde çalışması için istemcide Sun firmasının 1.4.1 veya üstü java plug-in eklentisinin makinede kurulmuş olması gerekmektedir. Bu kısıtlamalar raporun ilerleyen bölümlerinde detaylı olarak sebepleriyle anlatılacaktır.

Proje, en genel olarak java, java applet ve C/ C++ olarak iki ana kategoriye ayrılabilir.

Projenin java kısmında kullanıcı için bir arayüz oluşturulmuş ve çeşitli sınıflar oluşturularak javadan izin verdiği sürece yararlanılmaya çalışılmıştır. Bu noktada java appletlerin internet üzerinde bir sunucu üzerinde çalıştığı, bu yüzden herhangi bir istemcinin appleti çalıştırdığında  makinesinde oluşabilecek hasarlar göz önünde bulundurularak appletlere getirilmiş kısıtlamaları vurgulamakta fayda vardır. Java appletler ile doğal java (pure java) kullanılarak sistem kaynaklarına ulaşmak şu an için imkansızdır. Yapılan araştırmalar sonucunda sistem çağrıları yapabilmek için yine javanın kendi içinde desteklediği bir platform olan JNI bulunmuş ve bu da projenin içine C/C++ kodlarının ve dinamik kütüphanelerin katılmasını zorunlu kılmıştır.

Proje kapsamında applet üzerindeki bazı bilgilerin ve servislerin yapılmasında pure javanın kullanıldığı yerlerde vardır. Örneğin port taraması ya da basit sistem bilgilerinin alınması esnasında  programa hız kazandırmak amacıyla pure java metodları kullanılmış, böylece dinamik kütüphaneye erişim sırasında kaybedilecek zaman kazanılmıştır.

Çeşitli güvenlik kısıtlamalarının bulunduğu java appletlerde JNI kullanılmış bile olsa istemcinin appleti internet üzerinde çalıştırması için appletin güvenilir bir imzayla imzalanması ve karşı tarafta oluşacak hasarlara karşı appleti yazan kişinin sorumluluk alması gerekmektedir. Appletin istemcide ilk yüklendiği anda, appleti imzalayan kişi hakkında bilgiler çıkar ve appletin makinede çalışması için kullanıcıdan izni sorulur. Görüldüğü üzere istemcinin sistem kaynaklarından birine bile en ufak bir erişim söz konusu olduğunda (bu erişim en basitinden bir dosya okuma olayı olabilir.) java platformuna ait güvenlik katmanları devreye girmek suretiyle isteği sorgularlar. Eğer applet imzalanmamışşa yada kullanıcı appletin çalışmasına izin vermez ise applet bu noktada istisnai hata vererek (exception) işlemini durdurur. 

Projenin ikinci kısmında herhangi bir derleyici ile içinde fonksiyonlar bulunduran dinamik  bir kütüphane oluşturulmakta, ve bu fonksiyonlar yardımıyla istemci makinenin sistem bilgilerine ulaşılmaktadır. Burada işletim sistemi içinde kullanılan ve windows.h gibi içinde işletim sitemine ait fonksiyonların deklare edildiği  header dosyalarının kütüphaneye eklenmesi gerekmektedir. Bu header dosyları içinde bulunan sınıflar ve yapılar kullanılmak suretiyle çeşitli fonksiyonlar yardımıyla sistemden bilgiler alınır ve java appletlere gönderilir.

Dinamik kütüphaneden gelen verilerin java appletler tarafından alınması işlemi genel olarak JNI teknolojisinin birincil amacıdır. Buradaki işleyiş kısaca özetlenirse java dosyasında çeşitli fonksiyonlar tanımlanır ve başlarına native sözcüğü yerleştirilir. Java kodu derlenirken bu native  fonksiyonların bir başka yerden geleceğini düşünerek onları göz önünde bulundurmaz. Java kodu derlendikten sonra javah programı ile bir header  dosyası oluşturulur. Bu dosya c kodunun başına eklenir. Bu yapı ileriki bölümde anlatılacağından şimdilik fazla detaya girilmemiştir.


 

İÇİNDEKİLER

1 -  Giriş…………………………………………………………….……………….

1. Projeye genel bakış………………………………………………………..

            2. Proje adımları……………………………………………………………..

                        2.1. Saf java………………………………………………………….

                        2.2. J/Direct…………………………………………………………..

                                    2.2.1. @dll.import direktifi………………………………….. .                                    2.2.2. com.ms.win32 paketleri……………………………….

                                    2.2.3. J/Direct ve Microsoft hakkında güncel bilgiler……….

                        2.3. RNI................................................................................................

                        2.4. WMI..............................................................................................

3. Java & Java Applet………………………………………………………...

                        3.1. JVM……………………………………………………………...

                        3.2. Java Applet……………………………………………………....

                                    3.2.1. Applet Sınıfı………………………………………..….

                                    3.2.2. Applet Yapısı………………………………………..…

                                                3.2.2.1. Olay işleme…………………………………..

                                                3.2.2.2. Awt paketi ve arayüz………………………...

                                    3.2.3. Applet Kısıtlamaları…………………………………...

                                    3.2.4. İmzalı Appletler……………………………………….

            4. JNI…………………………………………………………………………

                        4.1. JNI nedir?………………………………………………………..

                        4.2. JNI kullanım amaçları…………………………………………...

                        4.3. JNI yapı ve özellikler……………………………………………

            5. Çalışma platformu ve kısıtlamalar………………………………………...

 

2 -  Gerçeklenen Çalışma……………..………………………………………….…

            1. Java Tarafı…………………………………………………………………

                        1.1. Applet Yapımı…………………………………………………..

                                    1.1.1. İskelet……………………………………………….…

                                    1.1.2. Arayüz…………………………………………………

                                    1.1.3. Olay Gerçekleme………………………………………

                                    1.1.4. Diğer Bilgiler………………………………………….

                        1.2. Saf java kodları………………………………………………….

                                    1.2.1. Kopyalama İşlemleri ………………………………….

1.2.2. Port tarama…………………………………………….

1.2.3. Diğer İşlemler……………………………………….…

                        1.3. Native çağrılar…………………………………………………...

                        1.4. Derleme aşaması………………………………………………...

                        1.5. Appletin İmzalanması…………………………………………...

 

            2. C/C++ tarafı……………………………………………………………….

                        2.1. Başlık dosyası……………………………………………………

                                    2.1.1. #include "system.h"……………………………………

                                    2.1.2. #include <windows.h>………………………………...

                        2.2. Fonksiyonlar……………………………………………………..

                                    2.2.1. JNI fonksiyon ve parameter aktarımı………………….

                                    2.2.2. Sistem fonksiyon ve yapıları…………………………..

                                    2.2.3. Kullanıcı Fonksiyonları………………………………..

                        2.3. Derleme aşaması………………………………………………...

 

3 -  Sonuç ve Öneriler………………………………………………………………

 

4 -  Ekler……………………………………………………………………………..

            4.1. Java programlarının derlenmesi ve çalıştırılması……………………….

            4.2. HTML Applet tagı………………………………………………………

            4.3. Garbage collection………………………………………………………

            4.4. Tarayıcı ve platform belirleme………………………………………….

            4.5. showStatus fonksiyonu………………………………………………….

 

5  - Kaynaklar……………………………………………………………………….

1

1

1

1

2

2

3

3

4

5

5

5

6

6

7

7

8

9

9

10

10

10

11

12

 

14

14

14

14

14

16

17

18

18

19

21

22

23

23

 

25

26

26

26

26

26

28

36

36

 

37

 

38

38

38

39

39

40

 

41