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