przejście do zawartości
zpr c++ quick reference
Narzędzia użytkownika
Zarejestruj się!
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Zarejestruj się!
Ostatnie zmiany
Menadżer multimediów
Indeks
Ślad:
jni
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== 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ń * 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>
jni.1208040588.txt.gz
· ostatnio zmienione: 2008/04/13 00:49 przez
chappaai
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Do góry