JNI-获取Java对象的成员变量-GeInttField()
例:
在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()的更多相关文章
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法
面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...
- Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限
一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...
- JAVA基础系列:内部类获取外部类的成员变量
内部类获取外部类的成员变量,使用 外部类类名.this.变量名 的形式获取 public class Outer { public String name = "outer"; c ...
- Java学习笔记十五:Java中的成员变量和局部变量
Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...
- JavaSE---类、对象、成员变量、局部变量
1.概述 1.1 类 1.1.1 类 是一种 自定义的 引用 数据类型: 1.2 对象 1.2.1 创建对象的根本途径:构造器: 通过new关键字 来调用 某个类的构造器: packa ...
- java中的成员变量和局部变量区别
1.作用域不同 成员变量的作用域在整个类内部都是可见,可用的: 局部变量的作用域仅限于定义它的方法,不能被其它方法调用: 2.初始值不同 java会给成员变量一个初始值,初始值为0: java不会给局 ...
- 获取JAVA对象占用的内存大小
介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...
- EL语法 ${person.id} 这里面的id指的是实例对象的成员变量
EL语法 ${person.id} 这里面的id指的是实例对象的成员变量
随机推荐
- Activex打包于发布完整版---ActiveX打包
前面介绍了数字证书的原理与制作:http://blog.csdn.net/jiangtongcn/article/details/13508365,下面来看一下ActiveX组件的打包. 我现在有一个 ...
- Flume-0.9.4数据插入HBase-0.96
来自:http://blog.csdn.net/iam333/article/details/18770977 最近由于业务需要,需要将flume的数据插入HBase-0.96,利用flume的实时日 ...
- faster rcnn测试VOC2012的问题
Traceback (most recent call last): File "./tools/test_net.py", line 90, in test_net(net, i ...
- Eclipse的tomcat插件
下载Tomcat Eclipse插件 http://www.eclipsetotale.com/tomcatPlugin.html 或者我的网盘 将tomcatPluginV321.zip内容解压到 ...
- eval、exec、execfile
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://blog.csdn.net/azhao_dn/article/details/6921654 ...
- zookeeper单节点和多节点配置
单机单节点模式 zookeeper解压, 放到 /opt/zookeeper/下, 新建一个latest的软链 $ latest 将 conf/zoo-sample.cfg 重命名为 zoo.cfg, ...
- 【微信小程序】实现类似WEB端【返回顶部】功能
1.原理:利用小程序自带的<scroll-view>组件,该组件的bindScroll和scroll-top方法.属性进行联合操作 2.效果图: 3.wxml: <scroll-vi ...
- [手把手教程][JavaWeb]优雅的SpringMvc+Mybatis整合之路
来源于:http://www.jianshu.com/p/5124eef40bf0 [手把手教程][JavaWeb]优雅的SpringMvc+Mybatis整合之路 手把手教你整合最优雅SSM框架:S ...
- Python接通图灵机器人
图灵机器人 图灵机器人特别low,问答水平并不高. import requests print("你好,我是图灵机器人") while 1: s = input() resp = ...
- 微信小程序四(设置底部导航)
好了 小程序的头部标题 设置好了,我们来说说底部导航栏是如何实现的. 我们先来看个效果图 这里,我们添加了三个导航图标,因为我们有三个页面,微信小程序最多能加5个. 那他们是怎么出现怎么着色的呢?两步 ...