native层修改Java对象中的数据

6 篇文章 0 订阅

以native层访问修改Java层对象中的string数据为例介绍:

1.获得object对应的类对象

    jclass cls = (*env)->GetObjectClass(env, obj);

2.从类对象中获得对象中数据的ID

   fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;")

   "s":参数名字

  "Ljava/lang/String;":参数描述

3.获得对象中数据在虚拟机中的地址

   jstr = (*env)->GetObjectField(env, obj, fid);

4.转为底层可以访问的数据

   str = (*env)->GetStringUTFChars(env, jstr, NULL);

5.修改数据

    jstr = (*env)->NewStringUTF(env, "123");

   (*env)->SetObjectField(env, obj, fid, jstr);   

具体实例如下

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");
       }
}
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);
   }

输出

In C:
     c.s = "abc"
In Java:
     c.s = "123"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值