例:

在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;@Overrideprotected 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();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bt_test:// called by native
            person.readAge();// called by javaint 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(...)
#endifJNIEXPORT void com_yuneec_demo_Person_readAge(JNIEnv *env, jobject obj)
{//获致obj中对象的classjclass 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, 100);
}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) < 0){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 -1;}if (JNI_TRUE != registerNativeMethods(env, classPathName,methods, sizeof(methods) / sizeof(methods[0]))){return -1;}return JNI_VERSION_1_4;
}
#endif

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

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

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

转载于:https://www.cnblogs.com/yongdaimi/p/9511631.html

JNI-获取Java对象的成员变量-GeInttField()相关推荐

  1. java程序如何访问成员变量,java如何访问成员变量

    通过Class对象的getField()方法,可以获得这种包含的所有或指定的成员变量Field,Filed提供以下两种方法阅读和设定成员变量值 1.getxx(Objectobj): 获得obj对象的 ...

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

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

  3. c2064 项不会计算为接受0个参数的函数_getMask()讨论:Abaqus Part对象的成员变量常用函数...

    最近工作之余,想制作一个自动对多cell的Part进行skin并建立相应set的小插件.我的目的是对该Part中各个cell分别进行skin,以便于将来赋予不同的属性.这样可以有效的减少输出结果文件的 ...

  4. http://www.dewen.net.cn/q/6120/如何获取Java对象的大小

    http://www.dewen.net.cn/q/6120/如何获取Java对象的大小 kenvi 1 票 kenvi 2078 在C或者C++里经常会通过sizeof来计算一个对象所占空间的大小, ...

  5. Java未赋值成员变量的初始值(默认值)

    Java未赋值成员变量的初始值(默认值) java中的所有变量必须先声明,后赋值才能使用. java中的成员变量,在创建对象的时候,都会执行一次初始化操作,都会给一个默认值. 基本数据类型默认值都是0 ...

  6. Cpp 对象模型探索 / 对象访问成员变量的原理

    一.栗子 1.源码 #include <iostream> #include <stdio.h>class Base { public:Base() { std::cout & ...

  7. java 对象地址_如何获取Java对象的地址?

    有没有办法获取Java对象的地址? 问题来自哪里?:首先,我读取属性文件,并将文件中的所有数据放入表中.属性文件可以更新.所以,我想听那个文件.我使用PropertyChangeSupport和Pro ...

  8. digester java_[jakarta-commons] 使用Digester解释xml获取java对象(代码入注规则 或 配置规则 任你选!)...

    # re: [jakarta-commons] 使用Digester解释xml获取java对象(代码入注规则 或 配置规则 任你选!) 2009-11-09 10:27 | Java小子 楼主,运行起 ...

  9. Java面向对象之成员变量的初始值、object类与对象

    一.成员变量初始值 1.测试 class Test06_Num{ //定义一个数据类//在类中定义各种类型的变量,但是不给值int i; byte b;short s;long l;float f;d ...

最新文章

  1. 130.被围绕的区域
  2. 2020十大热门机器学习项目
  3. 量子纠缠buff加持,雷达精度提高500倍,论文已登物理顶刊
  4. PHP下的Oauth2.0尝试 - OpenID Connect
  5. android 自定义打包,android 自定义打包后的app名称
  6. 什么是进程?Python进程各部分内容介绍
  7. oracle授权、表备份、用户管理
  8. python-玉米(小米)商城作业
  9. multipartfile 获取音频时长_QQ音乐移动端加入倍速播放,蓄力长音频发展 | 产品观察...
  10. 每日一练丨性能优化-实例优化(三)
  11. Win10 OneDrive无法同步文件怎么办?一个命令搞定
  12. [Java] 蓝桥杯 BASIC-8 基础练习 回文数
  13. Basic Edit in vim
  14. PDF文件有密码怎么解除?
  15. 2021年软件测试工具总结——接口测试工具
  16. unity教程:MMORPG网络游戏如何实现玩家同步
  17. 爬虫漫游指南:浏览器指纹
  18. 证券期货经营机构私募资产管理业务管理办法 2018年10月22日
  19. 简单有创意的思维导图怎么画
  20. JavaScript学习笔记2——JavaScript操作BOM对象

热门文章

  1. CVPR | 基于LiDAR的3D物体检测新框架
  2. 百度计算机视觉暑期实习面经(成功上岸!已拿offer)
  3. python社招面试_百度大牛总结十条Python面试题陷阱,看看你是否会中招
  4. python处理mat数据_python读取.mat文件的数据及实例代码
  5. linux中波浪号代表什么_建筑电气施工图纸中BV、ZRBLV和TC、SC符号代表什么?
  6. TTL怎么计算拉电流和灌电流_带你深入了解灌电流、拉电流与吸电流
  7. Webstorm React Nodejs 整合
  8. 员工转正述职答辩问什么问题_展风采 创未来 | 记德信地产杭州公司新员工转正述职答辩...
  9. mysql连接池 golang_Golang 你一定要懂的连接池
  10. 如何使用 Convert.exe 将分区转换为 NTFS 文件系统