案例三:C代码访问Java对象的实例变量

   获取对象的实例变量的步骤:

  1. 通过GetObjectClass()方法获得此对象的类引用

  2. 通过类引用的GetFieldID()方法获得实例变量的Field ID.

    你需要提供 变量名,字段类型描述符

    • 对于Java 类, 字段描述符格式为 "L<类全称>;" 类全称中,点"."用 "/"代替。例如,String 的描述符为"Ljava/lang/String;"

      注意:这里不要漏了分号";"

    • 对于基本类型,则有固定标识。注:这里不需要分号。

      int =>  "I" ,byte => "B",short => "S",long => "J",float => "F",double => "D",char => "C",boolean => "Z"

    • 对于数组,则结合以上类型描述符,加上前缀"[",

      如Object数组,用"[L/java/lang/Object;"表示

      int数组,用"[I"表示

   3. 基于FieldID,通过GetObjectField()方法或Get<基本类型>Field()方法获取实例变量。

   4. 如果需要更新实例变量,可以使用SetObjectField()或Set<基本类型>Field()函数进行

   以下是JNI用于获取实例变量的函数:(来自于头文件jni.h)

  

  此案例所有文件:

  

  (1)创建Java程序

  定义两个实例变量,一个为基本类型,另一个为对象类型。利用C代码对其进行更改,然后输出结果,校验其实例变量是否改变。

  (2)编译Java程序,并生成相关头文件

  

  (3)编写源文件实现。

  

  根据上述描述的获取成员变量的步骤进行。

  注:由于String在c语言中没有直接映射的类型,只能通过相关函数转换为以'\0'结尾的字符数组。

  (4)生成动态链接库,注这里直接指定库名为libdemo3.so,至于为何要加前缀lib,请看前文

  

   (5)执行Java程序

  

  由图可知,C代码成功改变了Java对象实例变量的值。

  

【详解】JNI (Java Native Interface) (三)的更多相关文章

  1. 【详解】JNI (Java Native Interface) (二)

    案例二:传递参数给C代码,并从其获取结果 注:这里传递的参数是基本类型的参数,在C代码中有直接的映射类型. 此案例所有生成的所有文件如下: (1)编写案例二的Java代码,如下: 这里我们定义了一个n ...

  2. 【详解】JNI (Java Native Interface) (四)

    案例四:回调实例方法与静态方法 描述:此案例将通过Java调用的C语言代码回调Java方法. 要想调用实例对象的方法,需要进行以下步骤: 1. 通过对象实例,获取到对象类的引用  => GetO ...

  3. Android Jni(Java Native Interface)笔记

    首先记录一个问题,关于如何用javah生成头文件. 为什么要生成头文件?在含有 static{ System.loadLibrary("hellojni"); } 这样代码的类下面 ...

  4. JNI(java Native Interface)

    参看: http://blog.csdn.net/xw13106209/article/details/6989415

  5. JNI(Java Native Interface)

    一.JNI(Java Native Interface)        1.什么是JNI:               JNI(Java Native Interface):java本地开发接口   ...

  6. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  7. 【详解】JNI(Java Native Interface)(一)

    前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互 ...

  8. Java Native Interface 四--JNI中引用类型

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...

  9. Android NDK开发之从Java与C互调中详解JNI使用(一)

    生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...

随机推荐

  1. jquery中data()和js中dataset属性的区别

    INTRO html的标签属性data-允许用户自定义属性.原生javascript和jquery分别定义了dataset属性和data()方法对标签中的data属性进行操作. 取值: 如我们定义这样 ...

  2. POJ2289 Jamie's Contact Groups(二分图多重匹配)

    Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 7721   Accepted: ...

  3. 微信小程序-button组件

    主要属性: 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 效果图: ml: <!--默认的but ...

  4. 【BZOJ4755】 [Jsoi2016]扭动的回文串

    BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...

  5. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  6. io读取文件时考虑问题有?

    1.根据不同的文件内容选择不同的操作类 文本文件选Reader\Writer 图片.视频  inputStream\outputStream 2.要考虑源文件的编码格式,例如源文件是以GBK编码的,要 ...

  7. springBoot2 基础语法

    请求响应 request对象 request 对象其实是HttpServletRequest 类型, 通过它可以获取请求相关的一切信息, 包含请求信息 . 以及请求参数 ,甚至可以当成往里面存储数据[ ...

  8. C/C++掌握技能(三)

    #include<cstdio> ][]={ //平年和闰年的每个月的天数 {,},{,},{,},{,},{,},{,},{,}, {,},{,},{,},{,},{,},{,} }; ...

  9. [ZJOI2010]基站选址(线段树优化dp)

    坑待填. \(Code\ Below:\) #include <bits/stdc++.h> #define lson (rt<<1) #define rson (rt< ...

  10. [学习笔记]树套树 线段树套Splay

    今天调了一个早上哈哈哈,不过因为\(Splay\),常数比较大 洛谷的评测记录: \(Code\ Below:\) #include <bits/stdc++.h> #define ll ...