sobota, 14 listopada 2009

Metody natywne

Zaczynamy! Mój pierwszy blog, mój pierwszy post. Dziś będzie o metodach natywnych(ang. native mathod) w Javie. Najpierw może krótko napiszę po co nam to. Metody natywne wykorzystujemy do odpalenia w Javie kodu napisanego w innym języku np C, C++, (Fortran chyba tez jest obsługiwany). Jeśli mamy duże ilości kodu napisanego w innym języku programowania to przepisanie tego na Jave będzie wymagało dużo czasu i pracy, do tego dojdą jeszcze testy itp.
Znacznie efektywniejszym sposobem jest użycie metod natywnych. Dodatkowo możemy używać metod natywnych żeby przyspieszyć działanie aplikacji pisanych w Javie. Implementacje metod natywnych zademonstruje na prostym przykładzie, który mam nadzieje zachęci Was do zglebienia bardziej szczegółowych informacji odnośnie tego tematu.

Na początku musimy napisać kod w Javie, implementujemy prosta klasę

listing HelloWorld.java
class HelloWorld
{
 public native static void print();

 static
 {
  System.loadLibrary("HelloWorld");
 }

 public static void main(String[] args)
 {
  print();
 }
}

Kod nie jest skomplikowany, wywołujemy natywna metodę print. Niżej w statycznym bloku ładujemy bibliotekę HelloWorld.

Następnie kompilujemy nasz kod:

$ javac HelloWorld.java

Kolejnym krokiem jest stworzenie pliku nagłówkowego HelloWorld.h, nie musimy jednak tworzyć tego sami.
Polecenie:

$ javah HelloWorld

wykona to za nas.

Oto listing pliku HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_Helloworld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  ();

#ifdef __cplusplus
}
#endif
#endif

Teraz możemy przystąpić do napisania naszej biblioteki w C

listing pliku HelloWorld.c
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_print()
{
 printf("Hello World! \n");
}

Nazwę funkcji kopiujemy z pliku nagłówkowego.

Kompilacje wykonujemy za pomocą polecenia:

$ gcc -fPIC -I jdk/include -I jdk/include -shared -o libHelloWorld.so HelloWorld.c

gdzie jdk to ścieżka do katalogu w którym znajduje się JDK, w moim przypadku wygląda to tak:

$ gcc -fPIC -I /usr/lib/jvm/java-6-sun-1.6.0.15/include
-I /usr/lib/jvm/java-6-sun-1.6.0.15/include -shared -o libHelloNative.so HelloNative.c

Nadszedł czas by sprawdzić działanie naszego programu. Ale wcześniej musimy jeszcze skonfigurować zmienną środowiskową:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH

i test działania:

$ java HelloWorld

Hello World!

Oczywiście metody natywne mogą przyjmować parametry czego akurat nie pokazałem w przykładzie, ale nie jest to takie trudne. Zachęcam do zainteresowania się metodami natywnymi, w internecie można znaleźć wiele informacji na ten temat. Pozwoli Wam to znacznie rozszerzyć możliwości Waszych programów np. poprzez wykorzystanie sterowników.

Brak komentarzy:

Prześlij komentarz