1.1.13.1. fejezet, HelloWorld
Ehhez a Java dokumentáció alapján készítsünk egy Java osztályt, amiben a native kulcsszóval jelölhetjük meg a külső erőforrásban található függvényt.
class HelloWorld { private native void print(); public static void main(String[] args) { new HelloWorld().print(); } static { System.loadLibrary("HelloWorld"); } }
Figyeljük meg, hogy a statikus inicializátor hogyan tölti be a külső könyvtárat (System.loadLibrary). Fodítsuk le javac-vel a programunkat.
javac HelloWorld.java
Mejd generáljunk egy C header fájlt a javah-val.
javah -jni HelloWorld
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 (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
Majd készítsünk el a C implementációt.
HelloWorld.c
#include <jni.h> #include <stdio.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("Hello World!\n"); return; }
Fordítsuk le a C kódot dll-re. Windows-ra ajánlom a MinGW használatát.
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-a -shared -I "F:\munka\JNI-teszt" -I "c:\Program Files\Java\jdk1.6.0_17\include" -I "c:\Program Files\Java\jdk1.6.0_17\include\win32" -I "c:\MinGW\Include" HelloWorld.c -o HelloWorld.dll
Az -I paraméter a további header fájl elérési útvonalakat jelöli. Ezeket tetszőlegesen írjuk át a saját útvonalainkra. További fordítási ötleteket ad a MinGW honlapja. Az elkészült dll legyen a futtatás könyvtárban, vagy a PATH globális változóban meghatározott valamely könyvtárban.
Linuxra g++ -al egyszerűen fordíthatunk .so fájlt:
gcc -Wall -D_JNI_IMPLEMENTATION_ -shared -I/home/JNI-teszt -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux HelloWorld.c -o libHelloWorld.so
Linux-nál a kód futtatása közben figyelni kell az osztott könyvtár elérésére.
java -Djava.library.path=. HelloWorld
Globálisan is megváltoztathatjuk a környezetet az LD_LIBRARY_PATH változón keresztül:
LD_LIBRARY_PATH=. export LD_LIBRARY_PATH
Csatolmány | Méret |
---|---|
JNI-teszt.zip | 10.31 KB |
- A hozzászóláshoz be kell jelentkezni
Hozzászólások
Linux x64 so fordítás jdk1.7-el és GCC 4.6.3-al
fordítás
futtatás: