JNI学习记录4-Fields

2017-03-03  本文已影响37人  ai___believe

JNI学习记录1-初建JNI工程
JNI学习记录2-local refence崩溃问题
JNI学习记录3-String and Array
JNI学习记录4-Fields
JNI学习记录5-Methods

一、Accessing Fields

Java:

class InstanceFieldAccess {
private String s;
private native void accessField();
public static void main(String args[]) {
InstanceFieldAccess c = new InstanceFieldAccess();
c.s = "abc";
c.accessField();
System.out.println("In Java:");
System.out.println(" c.s = "" + c.s + """);
}
static {
System.loadLibrary("InstanceFieldAccess");
}
}

JNI:

JNIEXPORT void JNICALL
Java_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jstring jstr;
const char str;
/* Get a reference to obj’s class */
jclass cls = (
env)->GetObjectClass(env, obj);
printf("In C:\n");
/* Look for the instance field s in cls */
fid = (env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
if (fid == NULL) {
return; /* failed to find the field */
}
/* Read the instance field s */
jstr = (
env)->GetObjectField(env, obj, fid);
str = (env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}
printf(" c.s = "%s"\n", str);
(
env)->ReleaseStringUTFChars(env, jstr, str);
/*Create a new string and overwrite the instance field*/
jstr = (env)->NewStringUTF(env, "123");
if (jstr == NULL) {
return; /* out of memory */
}
(
env)->SetObjectField(env, obj, fid, jstr);
}

Procedure for Accessing an Instance Field

  1. jclass cls = (*env)->GetObjectClass(env, obj); //从对象获得类。
  2. fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;"); //获得fieldid
  3. jstr = (*env)->GetObjectField(env, obj, fid); //获得field

示例中要得到的是一个对象类型,所以用GetObjectField. 此外JNI还提供
Get/SetIntField,Get/SetFloatField访问不同类型成员。

二、Field Descriptors

descriptors.png

例如:
java方法:long f (int n, String s, int[] arr);<------->signature: "(ILjava/lang/String;[I)J"

三、Accessing Static Fields

Java:

class StaticFielcdAccess {
private static int si;
private native void accessField();
public static void main(String args[]) {
StaticFieldAccess c = new StaticFieldAccess();
StaticFieldAccess.si = 100;
c.accessField();
System.out.println("In Java:");
System.out.println(" StaticFieldAccess.si = " + si);
}
static {
System.loadLibrary("StaticFieldAccess");
}
}

JNI:

JNIEXPORT void JNICALL
Java_StaticFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jint si;
/* Get a reference to obj’s class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In C:\n");
/* Look for the static field si in cls */
fid = (*env)->GetStaticFieldID(env, cls, "si", "I");
if (fid == NULL) {
return; /* field not found */
}

/* Access the static field si */
si = (*env)->GetStaticIntField(env, cls, fid);
printf(" StaticFieldAccess.si = %d\n", si);
(*env)->SetStaticIntField(env, cls, fid, 200);
}

流程与实例成员类似。

上一篇 下一篇

猜你喜欢

热点阅读