Saturday, February 10, 2007

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
SignatureCall...Method
Get...Field
booleanjbooleanunsigned char ZBoolean
byte jbyte signed char BByte
char jchar unsigned shortCChar
short jshort short SShort
int jint int IInt
long jlong long JLong
float jfloat float FFloat
double jdouble double DDouble
void void VVoid
nonprimitive jobject *...L...;Object

Examples
method definitionsignature
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, %d\n", 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
}
}

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home