例:

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

Java代码:

Person.java

  1. package com.yuneec.demo;
  2.  
  3. public class Person {
  4.  
  5. static {
  6. System.loadLibrary("td");
  7. }
  8.  
  9. public int age = 20;
  10.  
  11. public native void readAge();
  12.  
  13. public int getAge() {
  14. return age;
  15. }
  16.  
  17. }

MainActivity.java

  1. package com.yongdaimi.android.framework;
  2.  
  3. import com.yuneec.demo.Person;
  4.  
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11.  
  12. public class MainActivity extends Activity implements OnClickListener{
  13.  
  14. private Button bt_test;
  15. private Person person;
  16.  
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. bt_test = (Button) findViewById(R.id.bt_test);
  22. bt_test.setOnClickListener(this);
  23. person = new Person();
  24. }
  25.  
  26. @Override
  27. public void onClick(View v) {
  28. switch (v.getId()) {
  29. case R.id.bt_test:
  30. // called by native
  31. person.readAge();
  32. // called by java
  33. int java_age = person.getAge();
  34. Log.i("xp.chen", "java_age is: "+java_age);
  35. break;
  36. default:
  37. break;
  38. }
  39. }
  40.  
  41. }

C代码;

test_jni.c

  1. #ifdef __ANDROID__
  2.  
  3. #include <jni.h>
  4. #include <android/log.h>
  5. #include <stdio.h>
  6. #include "jnihelp.h"
  7.  
  8. #define LOG_TAG "xp.chen"
  9.  
  10. #ifdef LOG_TAG
  11. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
  12. #else
  13. #define LOGE(...)
  14. #endif
  15.  
  16. JNIEXPORT void com_yuneec_demo_Person_readAge(JNIEnv *env, jobject obj)
  17. {
  18. //获致obj中对象的class
  19. jclass clazz = (*env)->GetObjectClass(env, obj);
  20. // 获取java中age字段的ID(最后一个参数是age的签名)
  21. jfieldID id_age = (*env)->GetFieldID(env, clazz, "age", "I");
  22. // 获取age字段对应的值
  23. jint age = (*env)->GetIntField(env, obj, id_age);
  24. // 输出
  25. // printf("current age is: %d\n", number);
  26. LOGE("native-age is: %d\n", age);
  27. // 重新修改age字段的值为100。
  28. (*env)->SetIntField(env, obj, id_age, );
  29. }
  30.  
  31. static JNINativeMethod methods[] = {
  32. {"readAge","()V",(void*)com_yuneec_demo_Person_readAge},
  33. };
  34.  
  35. static const char *classPathName = "com/yuneec/demo/Person";
  36.  
  37. static int registerNativeMethods(JNIEnv* env, const char* className,JNINativeMethod* gMethods, int numMethods)
  38. {
  39. jclass clazz;
  40.  
  41. clazz = (*env)->FindClass(env, className);
  42. if (clazz == NULL){
  43. return JNI_FALSE;
  44. }
  45.  
  46. if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < )
  47. {
  48. return JNI_FALSE;
  49. }
  50.  
  51. return JNI_TRUE;
  52. }
  53.  
  54. void JNI_OnUnload(JavaVM* vm, void* reserved)
  55. {
  56. return;
  57. }
  58.  
  59. jint JNI_OnLoad(JavaVM* vm, void* reserved)
  60. {
  61. JNIEnv *env;
  62. if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
  63. return -;
  64. }
  65. if (JNI_TRUE != registerNativeMethods(env, classPathName,methods, sizeof(methods) / sizeof(methods[])))
  66. {
  67. return -;
  68. }
  69. return JNI_VERSION_1_4;
  70. }
  71. #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. Activex打包于发布完整版---ActiveX打包

    前面介绍了数字证书的原理与制作:http://blog.csdn.net/jiangtongcn/article/details/13508365,下面来看一下ActiveX组件的打包. 我现在有一个 ...

  2. Flume-0.9.4数据插入HBase-0.96

    来自:http://blog.csdn.net/iam333/article/details/18770977 最近由于业务需要,需要将flume的数据插入HBase-0.96,利用flume的实时日 ...

  3. faster rcnn测试VOC2012的问题

    Traceback (most recent call last): File "./tools/test_net.py", line 90, in test_net(net, i ...

  4. Eclipse的tomcat插件

    下载Tomcat Eclipse插件 http://www.eclipsetotale.com/tomcatPlugin.html 或者我的网盘 将tomcatPluginV321.zip内容解压到 ...

  5. eval、exec、execfile

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://blog.csdn.net/azhao_dn/article/details/6921654 ...

  6. zookeeper单节点和多节点配置

    单机单节点模式 zookeeper解压, 放到 /opt/zookeeper/下, 新建一个latest的软链 $ latest 将 conf/zoo-sample.cfg 重命名为 zoo.cfg, ...

  7. 【微信小程序】实现类似WEB端【返回顶部】功能

    1.原理:利用小程序自带的<scroll-view>组件,该组件的bindScroll和scroll-top方法.属性进行联合操作 2.效果图: 3.wxml: <scroll-vi ...

  8. [手把手教程][JavaWeb]优雅的SpringMvc+Mybatis整合之路

    来源于:http://www.jianshu.com/p/5124eef40bf0 [手把手教程][JavaWeb]优雅的SpringMvc+Mybatis整合之路 手把手教你整合最优雅SSM框架:S ...

  9. Python接通图灵机器人

    图灵机器人 图灵机器人特别low,问答水平并不高. import requests print("你好,我是图灵机器人") while 1: s = input() resp = ...

  10. 微信小程序四(设置底部导航)

    好了 小程序的头部标题 设置好了,我们来说说底部导航栏是如何实现的. 我们先来看个效果图 这里,我们添加了三个导航图标,因为我们有三个页面,微信小程序最多能加5个. 那他们是怎么出现怎么着色的呢?两步 ...