A Java Native Interface (JNI) segítségével C nyelven írt könyvtárakat érhetünk el, és a benne lévő függvényeket használhatjuk Java-ban. A Java kódunkban native kulcsszóval kell megadnunk a fejlécét a C-s függvényünknek, ilyen módon:
native int osszeadC(int a, int b);
Majd a System.load() vagy System.loadLibrary() segítségével meg kell adnunk a .so vagy .dll fájlunkat. a load()-nak teljes elérést kell megadni, a loadLibrary a java.library.path bejegyzésben szereplő könyvtárak egyikébe kell tenni a fenti fájlt. hogy ez hol van a
java -XshowSettings:properties
parancs kimenetében megtaláljuk.
Tehát nézzük a Java kódot:
class jnitest { static { System.load("/home/anon117/programozas/libjnitest.so"); } native int osszeadC(int a, int b); static public void main (String arg[]) { jnitest jni = new jnitest(); System.out.println(jni.osszeadC(1, 2)); } }
Ezt lefordítjuk a
javac jnitest.java
paranccsal, majd
javah jnitest
paranccsal létrehozzuk a C forrásunk fejléc fájlját.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest */
#ifndef _Included_jnitest
#define _Included_jnitest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnitest
* Method: osszeadC
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jnitest_osszeadC
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
Ahogy fent is látszik ezt nem kell babrálni, viszont szükségünk lesz belőle a függvényünk deklarációs részére. Ime a C kód:
#include <jni.h> #include <stdio.h> #include "jnitest.h" JNIEXPORT jint JNICALL Java_jnitest_osszeadC (JNIEnv *env, jobject obj, jint a, jint b) { jint result = a + b; return result; }
Itt a paraméter listában csak a típusok szerepelnek, meg kell adnunk az azonosítókat is. Ha ezzel megvagyunk le kell fordítanunk. Ez nálam így néz ki:
gcc -o libjnitest.so -shared -I/usr/jdk1.8.0_45/include/ -I/usr/jdk1.8.0_45/include/linux/ jnitest.c -lc
majd jöhet a próba:
java jnitest
3
További információk a Wiki oldalon.