【详解】JNI (Java Native Interface) (三)
案例三: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)(一)
- JNI (Java Native Interface)(二)
- JNI (Java Native Interface)(三)
- JNI (Java Native Interface)(四)
【详解】JNI (Java Native Interface) (三)的更多相关文章
- 【详解】JNI (Java Native Interface) (二)
案例二:传递参数给C代码,并从其获取结果 注:这里传递的参数是基本类型的参数,在C代码中有直接的映射类型. 此案例所有生成的所有文件如下: (1)编写案例二的Java代码,如下: 这里我们定义了一个n ...
- 【详解】JNI (Java Native Interface) (四)
案例四:回调实例方法与静态方法 描述:此案例将通过Java调用的C语言代码回调Java方法. 要想调用实例对象的方法,需要进行以下步骤: 1. 通过对象实例,获取到对象类的引用 => GetO ...
- Android Jni(Java Native Interface)笔记
首先记录一个问题,关于如何用javah生成头文件. 为什么要生成头文件?在含有 static{ System.loadLibrary("hellojni"); } 这样代码的类下面 ...
- JNI(java Native Interface)
参看: http://blog.csdn.net/xw13106209/article/details/6989415
- JNI(Java Native Interface)
一.JNI(Java Native Interface) 1.什么是JNI: JNI(Java Native Interface):java本地开发接口 ...
- android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...
- 【详解】JNI(Java Native Interface)(一)
前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互 ...
- Java Native Interface 四--JNI中引用类型
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...
- Android NDK开发之从Java与C互调中详解JNI使用(一)
生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...
随机推荐
- 数据压缩之经典——哈夫曼编码(Huffman)
(笔记图片截图自课程Image and video processing: From Mars to Hollywood with a stop at the hospital的教学视频,使用时请注意 ...
- int LL数据范围
unsigned int 0-4294967295 0~4e9 int -2147483648-2147483647 -2e9~2e9 unsigned long 0-4294967295 long ...
- HDU3480_区间DP平行四边形优化
HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前 i 个节点被分为 j 个区间所取得的最优值的情况 cost[i][j]表示从i ...
- 用命令行上传本地代码到GitHub
有两种方式上传,ssh和https,ssh老是报错=.=我用的是https 先下载git https://git-scm.com/downloads 在代码的文件夹的同级目录中邮件打开git ba ...
- 3.表单form
表单 表单的作用是收集信息. 表单的组成 ◆提示信息 表单控件 1.表单域 属性:action:处理信息 method=”get | post” get通过地址栏提供(传输)信息,安全性差. post ...
- Python--随机生成指定长度的密码
在浏览别人博客时学习了random模块,手痒自我练习下,写个随机生成指定长度的密码字符串的函数,拿出来供各位参考: 废话不多说,上代码: # coding: utf-8 import random i ...
- Python学习--和 Oracle 交互(2)
当在 mac 电脑上用 Python 读取 oracle 数据库中的中文时,有可能返回数据为“?” 解决方案: 在数据库操作的函数前添加以下代码, import sysreload(sys)sys.s ...
- 数据库索引、B树、B+树
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某 ...
- 聊聊如何设计千万级吞吐量的.Net Core网络通信!
聊聊如何设计千万级吞吐量的.Net Core网络通信! 作者:大石头 时间:2018-10-26 晚上 20:00 地点:QQ群-1600800 内容:网络通信, 网络库使用方式 网络库设计理念,高性 ...
- Windows下安装配置爬虫工具Scrapy及爬虫环境
爬虫工具Scrapy在Mac和Linux环境下都相对好装,但是在Windows上总会碰到各种莫名其妙的问题.本文记录下Scrapy在Window上的安装过程. 本文是基于Python2.7及Windo ...