Java Native Interface – setting and retrieving object fields


My reference: Java Native Interface

This table was specifically handy:

Java Type JNI Type machine dependent
C/C++ typedef
Signature CallMethod
GetField
boolean jboolean unsigned char Z Boolean
byte jbyte signed char B Byte
char jchar unsigned short C Char
short jshort short S Short
int jint int I Int
long jlong long J Long
float jfloat float F Float
double jdouble double D Double
void void V Void
nonprimitive jobject * L...; Object


Examples

method definition signature
int m1 () ()I
double m2 (long l, char c) (JC)D
void m3 (String s, int[] a) (Ljava/lang/String;[I)V
String m4 (boolean b) (Z)Ljava/lang/String;
Object m4 (BigDecimal b) (Ljava/math/BigDecimal;)Ljava/lang/Object;

My code testing implementing this field access:

HelloWorldNative.c (builds into .so linked from Java)

JNIEXPORT void JNICALL Java_helloworld_Main_nativePrintNumber
(JNIEnv *env, jobject obj, jint ji)
{
jfieldID fid;
jint version;
jclass c;
c = (*env)->GetObjectClass(env, obj);
fid = (*env)->GetFieldID(env, c, "version_number", "I");
version = (*env)->GetIntField(env, obj, fid);
(*env)->SetIntField(env, obj, fid, ji*ji);
printf("::: %d, %dn", fid, version);
hello_number(ji);
}

My Main.java, which the version_number integer field:

package helloworld;

/**
*
* @author thomas
*/
public class Main {
public int version_number;
private native void nativePrint();
private native void nativePrintNumber(int i);
/** Creates a new instance of Main */
public Main() {
version_number = 5;
}

static {
System.load("/home/thomas/testlib/HelloWorldNative/dist/HelloWorldNative.so");
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Main me = new Main();
me.nativePrint();
me.nativePrintNumber(2);
me.nativePrintNumber(5);
me.nativePrintNumber(3);
// TODO code application logic here
}
}

Leave a Reply

%d bloggers like this: