Bu Blogda Ara

4 Nisan 2010 Pazar

Java Native Access Basit Örnek

Java ile program geliştirmek çok rahat ve güvenilir olabilir. Fakat diğer tüm yorumlamaya dayalı diller gibi(C# vs.) Java'da doğrudan makine diline çevrilen programlama dilleri kadar hızlı değildir. Hız söz konusu değilse tabiki hiç bir sorun yok. Fakat bizim için hız önemli olduğunda ne yapacağız?
a)Java vb. dilleri bırak, C/C++ ya da Delphi gibi dilleri kullan.
b)Kullandığın dillerden vazgeçme gerekli bölgeyi soyutla.

Ben b şıkkını seçiyorum :) Peki b şıkkında anlatamak istediğim nedir?

Örneğin bir program geliştreceğiz. Bu programda çok ağır matematiksek işlemler var. Bunları Java ile yaptığımız zaman istediğimiz sürede istediğimiz verimlilikte sonuçlar alamıyoruz. Öyle ise bize sıkıntı çıkartan kısmı alıp, C/C++, Delphi ya da bir başka donanıma yakın olan bir dil ile yazıyoruz. Bu yazdığımız bölümü DLL olarak oluşturuyoruz. Artık tek yapmamız gereken Java projemizden bu DLL içerisindeki gerekli fonksiyonları zamanı geldiğinde çağırmak.

Bunu yapmamız için Sun Microsystems tarafından yazılmış bir kütüphane mevcut. JNA (Java Native Access). Bu kütüphane ile sabit disk üzerideki (başka bir dil ile yazılmış) DLL dosyalarındaki fonksiyınları çağırabiliyoruz.

Şimdi yamamız gereken temel adımlardan bahsedeyim.

1) Bir java projesi oluşturalım.
2) https://jna.dev.java.net/ adresinden JAR dosyasını sabit diskimize indirelim.
3) İndirdiğimiz kütüphaneyi projemize ekleyelim.
(NetBeans 6.8 için ekleme)
Libraries (sağ tık) -> Add JAR/Folder...


4) Projemizde bir interface oluşturarak kullanacağımız fonksiyonların tanımlamasını yapmalım.
5) İhtiyacımız olan fonksiyonu çağıralım. :)

Örnek bir kod parçası:

import com.sun.jna.*;

public class testMessage {

public interface Simple extends Library
{
public void TestMessage();
}

public static void main(String[] args)
{
Simple dll = (Simple)Native.loadLibrary("Simple.dll", Simple.class);
dll.TestMessage();
}

}


Bu kadar basit. JNA ile yalnızca Windows değil MacOS X, Linux ve Unix platformlarında da çalışabilirsiniz. Yanlız hata kontrolünü çok iyi tutmak gerekiyor. Lakin benim bir kaç denememde JVM (java.exe) çökmesi gibi durumlarla karşılaştım. Çünkü direk düşük seviye işlemleri yapılıyor. Java için son olarak birde JNI (Java Native Interface) var. Kendi yazdığımız C programlarına direk erişim için. Onu kısmet olursa başka bir zaman anlatmayı düşünüyorum.

C# tarafında da aynı olayın mümkün olduğunu söyleyebilirim. Orada işler biraz daha basit. Herhangi bir kütüphane kullanmanıza gerek yok. Yapı şu şekilde:

[DllImport("Simple.dll")]
static extern int TestMessage();

static void Main(string[] args)
{
TestMessage();
}


Sonuç olarak Java, C# vb. dillerin görsellik, güvenilirlik ve diğer mükemmel özelliklerini alıp, hantallık gibi diğer kötü özelliklerini bu sistemle değiştirmiş oluyoruz. Her sistemin güzel özelliğini bir araya getirerek çok kaliteli ürünler ortaya çıkarmak mümkün.

7 yorum:

PC KİTABI dedi ki...

uygulamayı incelemek icin rarlayıp yollaya bilirmisin?

PC KİTABI dedi ki...

uygulamayı ve dll dosyasını dll hazırlayan siz seniz c dosyalarını yollayabilirmisiniz?

PC KİTABI dedi ki...

Uyuglamanyı dll dosyası varsa c dosyalarını incelemek icin yollayabilirmisiniz ?

Ramazan Bellek dedi ki...

Evet uygulama ve dll dosyalarını ben hazırlamıştım fakat üzerinden çok zaman geçti artık dosyalar ben de değil. Yanlış hatırlamıyorsam şu yazımda geçen dll i kullanmış olabilirim. (http://rbellek.blogspot.com/2010/04/dynamic-link-library-dll-giris.html) bu adresteki dll assembly ile yazmıştım ama bunu kullanmak zorunda değilsiniz, Visual Studio ile bir C++ projesi açın, Dynamic DLL tipini seçin ve içerisine SimpleMessage diye bir fonksiyon oluşturun. Daha detaylı bilgi için c++ dynamic dll anahtar kelimeleriyle arama yapabilirsiniz. İyi çalışmalar.

PC KİTABI dedi ki...

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'HelloWorld.dll': Belirtilen modül bulunamad?. bole bir uyarı alıyorum dl bu adresten gosterimle yaptım link:http://www.bilisimcileriz.com/java/java-ile-dll-kullanimi-jni-java-native-interface/

onur dedi ki...

Merhaba,
Peki C# ile derlenmiş bir DLL dosyasını Java'da JNA ile nasıl kullanabiliriz ? Bunun için de bir örnek yaparmısınız ?
Teşekkürler.

Ramazan Bellek dedi ki...

JNA kısaltmasındaki N harfi İngilizce Native (yerli, yerli mal, tabii vb.) kelimesinin baş harfidir. Mânâsı o makineye has koddan müteşekkil yapıdır. Yani Java ya da .NET gibi bir framework olmadan doğrudan makine koduyla çalışan uygulamalar. Standart C/C++ ile üretilen DLL ler buna örnek olabilir. Sizin sorunuza gelince, daha önce denemediğimi belirterek az önce verdiğim bilgilere dayanarak bunun mümkün olmadağını tahmin ediyorum. Çünkü ismi gereği NATIVE kod çalıştırması beklenmektedir. Belkide arada bir wrapper DLL kullanarak asıl işi yapacak C# ile yazılmış DLL çağrılabilir. Yalnız şu hususu da belirtmeden geçemeyeceğim, JNA in doğuşu NATIVE kod çalıştırma (hızlı ve makineye yakın) ihtiyacına bir cevap olarak gerçekleşmiştir, C# ile DLL yazacağınıza tüm uygulamayı C# ile ya da tamamını Java ile yazmanız daha mantıklı değil mi?