图文教程vs2008+eclipse jni教程实例(二) 调用和修改java类中的属性。

看这篇文章的童鞋,我都视你已经掌握了vs+eclipse搭建jni实例环境,如果不会,可以参考我的另外一篇文章 图文教程vs2008+eclipse开始jni教程实例(一) 

当我们在做jni时,经常需要在C中调用或改动java类中成员的属性值,今天正好看到这里,做一下笔记。

先贴一下我的java 代码

package com.easou.abo.jnitest;

public class Demo {
	public int number = 10;//number属性值初始为10
	public native void test();
	public static void main(String[] args) {
		System.loadLibrary("testJni");
		Demo dm = new Demo();
		dm.test();//native方法,在里面会调用和改动number
		System.out.println(dm.number);//native结束后,再输出number值,是否改变
	}

}


非常的简单,我们在c代码中要做两件事,1、调用number值 2、改动number值

C代码

#include "com_easou_abo_jnitest_Demo.h"
#include <stdio.h>
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL

Java_com_easou_abo_jnitest_Demo_test(JNIEnv * env, jobject obj){
	jclass hello_clazz = env->GetObjectClass(obj);//获得java中的类
	jfieldID fieldID_prop = env->GetFieldID(hello_clazz,"number","I");//得到number的ID,GetFieldID在jni.h中定义,最后那个参数为sign
	jint number = env->GetIntField(obj,fieldID_prop);//得到number的值
	cout << number << endl;//输出number
	env->SetIntField(obj,fieldID_prop,100);//设置number的值
}

 

GetFieldID函数最后一个参数我们这里写的是"I",这个"I"怎么来的呢,有两种方法

1、根据《jni详解》(下载jni详解)28页开始,有详细的sign讲解

2、运行jvap命令,直接获取,这样省事很多吐舌头

其他没什么难度的东西,理解即可。

最后运行,会在eclipse的控制台输出

10

100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值