文档章节

五、JNI提供的函数介绍(一):类和对象操作

unic0rn
 unic0rn
发布于 2016/07/14 16:37
字数 926
阅读 45
收藏 0
jni

 

如果你要开始JNI编程,你还需要了解JNI提供了哪些函数供你调用。

这些函数都定义在了jni.h文件,包括上一篇文章介绍的数据类型,也都在这个头文件中。

 

类和对象操作

假设你要在JNI层使用C代码创建一个Java对象,并对其属性赋值,并返回这个对象到Java层,需要哪些操作?

    1.找到这个类

    2.实例化这个类

    3.找到这个对象的属性并对其赋值或者找到并调用可以对其属性赋值的方法

    4.return 这个对象

 

对应以上四个步骤,JNI都提供了相应的函数:

    1.查找类 ->FindClass函数 ,或者从一个现成的jobject从获取jclass -> GetObjectClass函数,或者定义类DefineClass函数

    2.实例化这个类 -> AllocObject函数或NewObject函数(附有带V版和带A版),得到jobject

    3.找到这个对象的属性->GetFieldID函数(静态属性使用GetStaticFieldID函数)得到jfiledID,

        或者找到可调用的方法->GetMethodID函数(静态方法使用GetStaticMethodID函数)得到jmethodID

        对属性赋值->Set<Type>Field函数,调用方法Call<Type>Method函数

    4.return jobject

 

其他类和对象的操作函数:

1.IsAssignableFrom函数:是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的子类或接口

2.IsSameObject函数:从函数名称上就可以看出是判断两个对象是否是同一个对象

3.IsInstanceOf函数:判断一个对象是否是一个类的实例

4.GetSuperclass函数:获取一个jclass的父jclass

 

说明:

    1.Set<Type>Field函数中<Type>是根据属性数据类型变化的,例如数据类型为int,那么函数就是SetIntField函数

    具体如下图:

 

        八种基本数据类型都有对应的方法,其他引用类型统一使用SetObjectFiled函数,看上面第二图,有set当然也有get啦

    如果是静态属性的话,jni也是提供好了:

 

    2.Call<Type>Method函数中<Type>是根据返回值变化的,例如返回值为int,则函数为CallIntMethod

    具体如下图:

    如上两图,每个方法都有附属两个版本——带V版和带A版,这个不是重点,先忽略他们。

    可以发现<Type>的取值就是八种基本数据类型、Object和void

    而V版和A版与什么都不带的版本区别仅仅在于最后一个方法参数(Java参数列表)的数据类型不同

 

    JNI也定义了静态方法的调用函数:

    形式与非静态方法相似

 

CallNonvirtalShortMethod(jobject obj, jclazz clazz, jmethodID methodID, ...);

在实际开发中(时刻App服务端JNI),将结构体一 一赋值到到Java对象返回到Java层出现了一些莫名其妙的问题,后来改成将结构体序列化为json返回到Java层,

这个问题今晚(2015/12/18)刚好已经解决,是因为Java类属性为Integer类型,jni不能直接返回jint类型,而是需要new 一个Integer的jobject返回到Java层,避免麻烦,我把类属性都换成了int类型,不再出现莫名其妙崩溃的问题。但是结构体一一赋值给java对象属性编写太麻烦,还经常出问题,传递复杂数据类型,我更倾向于使用传递Json的形式。

加我QQ:981656164,共同学习交流,记得备注 —— OSC!  ~~ <( ̄3 ̄)> 

 

 

 

© 著作权归作者所有

共有 人打赏支持
unic0rn
粉丝 8
博文 76
码字总数 36275
作品 1
泉州
项目经理
Android JNI学习(四)——JNI的常用方法的中文API

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
Android JNI学习(三)——Java与Native相互调用

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
android源码-深入理解JNI技术

9/5/2016 2:10:30 PM android源码-深入理解JNI技术 本章涉及的源代码文件名及位置 AndroidRunTime.cpp (framework/base/core/jni/AndroidRunTime.cpp)JNIHelp.c (libnativehelper/JNIHelp.c)......

小米墨客
2016/09/07
3.1K
3
Android平台上的JNI技术介绍

NDK简介 Android是由Google领导开发的操作系统,Android依靠其开放性,迅速普及,成为目前最流行的智能手机操作系统。 图0-1 Android系统架构图 图0-1是Android系统架构图。大多数程序位于最...

ChowJames
2012/10/01
0
0
深入理解JNI

深入理解JNI 本章主要内容 · 通过一个实例,介绍JNI技术和在使用中应注意的问题。 本章涉及的源代码文件名及位置 下面是本章分析的源码文件名及其位置。 · MediaScanner.java framework/ba...

xiaole0313
2016/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部