例:

在Java中定义一个属性,然后用C语言将其设置成另外的值,并输出出来。

Java代码:

Person.java

package com.yuneec.demo;

public class Person {

    static {
System.loadLibrary("td");
} public int age = 20; public native void readAge(); public int getAge() {
return age;
} }

MainActivity.java

package com.yongdaimi.android.framework;

import com.yuneec.demo.Person;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button bt_test;
private Person person; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_test = (Button) findViewById(R.id.bt_test);
bt_test.setOnClickListener(this);
person = new Person();
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_test:
// called by native
person.readAge();
// called by java
int java_age = person.getAge();
Log.i("xp.chen", "java_age is: "+java_age);
break;
default:
break;
}
} }

C代码;

test_jni.c

#ifdef __ANDROID__

#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include "jnihelp.h" #define LOG_TAG "xp.chen" #ifdef LOG_TAG
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#else
#define LOGE(...)
#endif JNIEXPORT void com_yuneec_demo_Person_readAge(JNIEnv *env, jobject obj)
{
//获致obj中对象的class
jclass clazz = (*env)->GetObjectClass(env, obj);
// 获取java中age字段的ID(最后一个参数是age的签名)
jfieldID id_age = (*env)->GetFieldID(env, clazz, "age", "I");
// 获取age字段对应的值
jint age = (*env)->GetIntField(env, obj, id_age);
// 输出
// printf("current age is: %d\n", number);
LOGE("native-age is: %d\n", age);
// 重新修改age字段的值为100。
(*env)->SetIntField(env, obj, id_age, );
} static JNINativeMethod methods[] = {
{"readAge","()V",(void*)com_yuneec_demo_Person_readAge},
}; static const char *classPathName = "com/yuneec/demo/Person"; static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods)
{
jclass clazz; clazz = (*env)->FindClass(env, className);
if (clazz == NULL){
return JNI_FALSE;
} if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < )
{
return JNI_FALSE;
} return JNI_TRUE;
} void JNI_OnUnload(JavaVM* vm, void* reserved)
{
return;
} jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv *env;
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return -;
}
if (JNI_TRUE != registerNativeMethods(env, classPathName,methods, sizeof(methods) / sizeof(methods[])))
{
return -;
}
return JNI_VERSION_1_4;
}
#endif

编译成功后,在eclipse中的运行结果为:

第一个是在C代码中读取到的Java中成员变量age的值。

第二个是在Java代码中读取到成员变量的值(在Native层作了修改)。

JNI-获取Java对象的成员变量-GeInttField()的更多相关文章

  1. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  2. Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法

    面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...

  3. Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限

    一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...

  4. JAVA基础系列:内部类获取外部类的成员变量

    内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer { public String name = "outer"; c ...

  5. Java学习笔记十五:Java中的成员变量和局部变量

    Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...

  6. JavaSE---类、对象、成员变量、局部变量

    1.概述 1.1 类 1.1.1 类   是一种  自定义的  引用  数据类型: 1.2 对象 1.2.1 创建对象的根本途径:构造器: 通过new关键字   来调用  某个类的构造器: packa ...

  7. java中的成员变量和局部变量区别

    1.作用域不同 成员变量的作用域在整个类内部都是可见,可用的: 局部变量的作用域仅限于定义它的方法,不能被其它方法调用: 2.初始值不同 java会给成员变量一个初始值,初始值为0: java不会给局 ...

  8. 获取JAVA对象占用的内存大小

    介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...

  9. EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

    EL语法 ${person.id} 这里面的id指的是实例对象的成员变量

随机推荐

  1. ubuntu Server 设置主机静态 ip地址

    ubuntu Server 设置主机静态 ip地址 1:先输入 ifconfig 查看当前网络配置 2:然后关闭 eth0 网卡 sudo ifdown eth0 3:配置静态ip sudo vim ...

  2. 选择合适的Linux版本

    以下纯属个人想法:欢迎指正 1.Linux桌面系统,首选Ubuntu.当然Ubuntu也有服务器版本,不建议使用 2.服务端的Linux稳定的服务器系统,在企业中从事运维工作Redhat或者CentO ...

  3. Linux软件安装方法

    常用的两种软件安装方法: 1.RPM软件安装 rpm -qi 软件名 查询 rpm -ivh *.rpm 安装 rpm -e 软件名 卸载 系统自带的一些rpm包在系统镜像的Server文件夹里,需要 ...

  4. 算法笔记_111:第五届蓝桥杯软件类省赛真题(Java本科A组)试题解答

     目录 1 猜年龄 2 李白打酒 3 神奇算式 4 写日志 5 锦标赛 6 六角填数 7 绳圈 8 兰顿蚂蚁 9 斐波那契 10 波动数列   前言:以下试题解答代码部分仅供参考,若有不当之处,还请路 ...

  5. java的过滤器对session进行检查

    private void sendErrorToBrowser(HttpServletRequest request,HttpServletResponse response) throws IOEx ...

  6. 身份证查询API

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://apistore.baidu.com/apiworks/servicedetail/113.h ...

  7. 使用Properties去读取配置文件,并获得具体内容值

    有时候,写了一个配置文件,需要知道读出来的内容对不对,我们需要测试一下,看看读出来的跟我们要的是不是一样.这里写了一个工具类,用来读取配置文件里面的内容. 一.使用Properties工具类来读取. ...

  8. linux上传下载文件rz,sz

    [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum install lrzsz -y 注意:rhel安装完系统后 直接可使用 rz sz █ 法二:源文 ...

  9. jsp里面实现asp.net的Global文件内容。

    Global.java文件: import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import ...

  10. yaml语法三大规则

    规则一:缩进 yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack需要每个缩进级别由两个空格组成.一定不能使用tab键 规则二:冒号 yaml:  mykey: my_value  每 ...