看这篇文章的童鞋,我都视你已经掌握了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