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ányMéret
Csomag ikon JNI-teszt.zip10.31 KB

Hozzászólások

fordítás

gcc -Wall -D_JNI_IMPLEMENTATION_ -shared -I/home/pzoli/ProjectsSVN/JNITeszt/JNI-teszt -I/home/pzoli/programs/jdk1.7.0_21/include -I/home/pzoli/programs/jdk1.7.0_21/include/linux -fPIC HelloWorld.c -o libHelloWorld.so

futtatás:

java -cp . -Djava.library.path=. HelloWorld