Narzędzia użytkownika

Narzędzia witryny


jni

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Next revision
Previous revision
Next revision Both sides next revision
jni [2008/04/13 00:18]
chappaai utworzono
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ń
 +  * 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.txt · ostatnio zmienione: 2008/04/16 23:55 przez chappaai