Simple JNI – passing array from C to Java
Create these files:
/* Simple.h */ #include "jni.h" JNIEXPORT jintArray JNICALL Java_Simple_getArray (JNIEnv *, jobject, jint);
/* Simple.c */ #include <stdio.h> #include <stdlib.h> #include "Simple.h" #include "jni.h" JNIEXPORT jintArray JNICALL Java_Simple_getArray (JNIEnv *env, jobject obj, jint size) { int i; jintArray position=(jintArray)(*env)->NewIntArray(env,size); if(position==NULL) return NULL; jint *f = calloc(size, sizeof(jint)); for(i=0; i < size; i++) { f[i] = i; } (*env)->SetIntArrayRegion(env,position,0,size,(jint*)f); return position; }
/* Simple.java */ class Simple { public native int[] getArray(int size); static { System.loadLibrary("Simple"); } }
/* Main.java */ public class Main { public static void main(String[] args) { System.out.println("library: " + System.getProperty("java.library.path")); System.out.println("Getting array from C"); Simple simple = new Simple(); int [] array = simple.getArray(4); for(int i=0;i<array.length;i++) { System.out.println("Hello from Java: " + array[i]); } } }
Execute following commands:
export JAVA_HOME=/wherever_your_java_path_is/ $JAVA_HOME/bin/javac *.java $JAVA_HOME/bin/javah -jni Simple cc -g -shared -fpic -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux \ Simple.c -o libSimple.so export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH $JAVA_HOME/bin/java Main
— MAC OS X —
cc -g -shared -fpic -I/Library/Java/Home/include Simple.c -o libSimple.dylib
If you are looking for more JNI samples, take a look here: http://jnicookbook.owsiak.org
October 28th, 2012 in
main entries