Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
jni [2008/04/13 00:21] chappaai |
jni [2008/04/13 00:49] chappaai |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
====== Java JNI i C++ ====== | ====== Java JNI i C++ ====== | ||
- | Ta strona zawiera prosty przykład zastosowania Java Native Interface. Technologia ta pozwala łączyć kod Javy z kodem pisanym pisanym w językach specyficznych dla danej platformy. Potrzeba łączenia Javy z C++ zachodzi np gdy maszyna wirtualna nie jest w stanie zapewnić nam wystarczającej szybkości obliczeń. | + | Ta strona zawiera prosty przykład zastosowania Java Native Interface. Technologia ta pozwala łączyć kod Javy z kodem pisanym pisanym w językach specyficznych dla danej platformy. Potrzeba łączenia Javy z C++ zachodzi np gdy |
+ | * maszyna wirtualna nie jest w stanie zapewnić nam wystarczającej szybkości obliczeń | ||
+ | * Chcemy połączyć aplikację javy z juz istniejącym kawałkiem oprogramowania napisanego w C/C++ | ||
+ | ===== Uruchamianie ===== | ||
+ | Aby uruchomić przykładowy program wykorzystujący JNI należy: | ||
+ | * Utworzyć klasę (Javaclass.java), która deklaruje metodę natywną | ||
+ | * skompilowac tę klasę za pomocą polecenia 'javac' i w ten sposób otrzymać Javaclass.class | ||
+ | * uzyc javah -jni aby otrzymac plik naglowkowy, w oparciu o ktory napiszemy kod w C++ | ||
+ | * napisac kod w C++ | ||
+ | * skompilować kod do postaci biblioteki (*.dll pod Windows, *.so pod Solarisem) | ||
+ | * uruchomić program Javaclass | ||
+ | |||
+ | Przykladowa seria polecen potrzebna do kompilacji przykładu na platformie Windows: | ||
+ | |||
+ | <code cpp> | ||
+ | javac .\jni_pkg\Jni.java | ||
+ | javah -jni jni_pkg.Jni | ||
+ | cl -I "c:\Program Files\Microsoft Visual Studio 9.0\VC\include" -I "c:\j2sdk1.4.2_17\include | ||
+ | -I"c:\j2sdk1.4.2_17\include\win32" -LD jni_pkg_Jni.cpp -FeJni_lib.dll'' | ||
+ | </code> | ||
+ | |||
+ | ===== Kod Java ===== | ||
+ | Kod zawiera kilka deklaracji przykladowych metod natywnych które sa następnie w nim wykorzystywane. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * @author Lukasz Mosdorf G1ISI | ||
+ | */ | ||
+ | /** | ||
+ | * Program ilustrujący Zastosowanie JNI - Java Native Interface. | ||
+ | * Kod wywołuje | ||
+ | */ | ||
+ | package jni_pkg; | ||
+ | |||
+ | public class Jni { | ||
+ | |||
+ | public int myInt = 10; | ||
+ | public static String mystring = "JNI example"; | ||
+ | public int[] intArray; | ||
+ | private static native void native_call(); // sample native call | ||
+ | private static native String change_string(String arg); | ||
+ | private native int sumArray(int[] arr); | ||
+ | private native int initCppObj(); | ||
+ | private native int deleteCppObj(); | ||
+ | private native int changeCppObjField(int a); | ||
+ | private native void callMe(); | ||
+ | public int cppObjPtr; | ||
+ | private void callback() | ||
+ | { | ||
+ | System.out.println("Java wywolana z cpp"); | ||
+ | } | ||
+ | //Static- wywolywane na saym poczatku | ||
+ | static { | ||
+ | System.loadLibrary("Jni_lib"); | ||
+ | } | ||
+ | |||
+ | public static void main(String[] args) | ||
+ | { | ||
+ | Jni jni = new Jni(); | ||
+ | int arr[] = new int[10]; | ||
+ | |||
+ | //wywołanie metody natywnej, która zmienia podany obiekt String | ||
+ | String input = jni.change_string("String wyslany do metody natywnej"); | ||
+ | System.out.println("Dostano w Javie zmieniony string: "+ input); | ||
+ | |||
+ | //Zapełnienie tablicy danymi i wywołanie natywnje funkcji sumującej | ||
+ | for (int i = 0; i < 10; i++) { | ||
+ | arr[i] = i; | ||
+ | } | ||
+ | int sum = jni.sumArray(arr); | ||
+ | System.out.println("Suma tablicy zwrocona z metody natywnej = " + sum); | ||
+ | |||
+ | //inicjalizaja obiektu lol, wskaznik przechowywany w cppObjPtr | ||
+ | jni.initCppObj(); | ||
+ | System.out.println("Obiekt lol zaalokowany: "+ jni.cppObjPtr); | ||
+ | //Wywołanie metody obiektu uprzednio zaalokowanego, | ||
+ | //ktora zmienia wartosc jego pola | ||
+ | jni.changeCppObjField(15); | ||
+ | //wołanie metody która wywołuje motodę obiektu wołającego | ||
+ | jni.callMe(); | ||
+ | jni.deleteCppObj(); | ||
+ | System.out.println("Obiekt lol usuniety, ptr: "+ jni.cppObjPtr); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===== Kod Cpp ===== | ||
+ | |||
+ | Poniżej przedstawiono plik nagłówkowy wygenerowany automatycznie przy uzyciu polecenia javah -jni jni_pkg.Jni. | ||
+ | |||
+ | <code cpp> | ||
+ | /*Lukasz Mosdorf G1ISI | ||
+ | *Plik "jni_pkg_Jni.h" generowany | ||
+ | *przy wywolaniu polecenia javah -jni jni_pkg.Jni | ||
+ | */ | ||
+ | |||
+ | /* DO NOT EDIT THIS FILE - it is machine generated */ | ||
+ | #include <jni.h> | ||
+ | /* Header for class jni_pkg_Jni */ | ||
+ | |||
+ | #ifndef _Included_jni_pkg_Jni | ||
+ | #define _Included_jni_pkg_Jni | ||
+ | #ifdef __cplusplus | ||
+ | extern "C" { | ||
+ | #endif | ||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: native_call | ||
+ | * Signature: ()V | ||
+ | */ | ||
+ | JNIEXPORT void JNICALL Java_jni_1pkg_Jni_native_1call | ||
+ | (JNIEnv *, jclass); | ||
+ | |||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: change_string | ||
+ | * Signature: (Ljava/lang/String;)Ljava/lang/String; | ||
+ | */ | ||
+ | JNIEXPORT jstring JNICALL Java_jni_1pkg_Jni_change_1string | ||
+ | (JNIEnv *, jclass, jstring); | ||
+ | |||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: sumArray | ||
+ | * Signature: ([I)I | ||
+ | */ | ||
+ | JNIEXPORT jint JNICALL Java_jni_1pkg_Jni_sumArray | ||
+ | (JNIEnv *, jobject, jintArray); | ||
+ | |||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: initCppObj | ||
+ | * Signature: ()I | ||
+ | */ | ||
+ | JNIEXPORT jint JNICALL Java_jni_1pkg_Jni_initCppObj | ||
+ | (JNIEnv *, jobject); | ||
+ | |||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: deleteCppObj | ||
+ | * Signature: ()I | ||
+ | */ | ||
+ | JNIEXPORT jint JNICALL Java_jni_1pkg_Jni_deleteCppObj | ||
+ | (JNIEnv *, jobject); | ||
+ | |||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: changeCppObjField | ||
+ | * Signature: (I)I | ||
+ | */ | ||
+ | JNIEXPORT jint JNICALL Java_jni_1pkg_Jni_changeCppObjField | ||
+ | (JNIEnv *, jobject, jint); | ||
+ | |||
+ | /* | ||
+ | * Class: jni_pkg_Jni | ||
+ | * Method: callMe | ||
+ | * Signature: ()V | ||
+ | */ | ||
+ | JNIEXPORT void JNICALL Java_jni_1pkg_Jni_callMe | ||
+ | (JNIEnv *, jobject); | ||
+ | |||
+ | #ifdef __cplusplus | ||
+ | } | ||
+ | #endif | ||
+ | #endif | ||
+ | |||
+ | |||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||