java jni 方法描述,五、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
对属性赋值->SetField函数,调用方法CallMethod函数
4.return jobject
其他类和对象的操作函数:
1.IsAssignableFrom函数:是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的子类或接口
2.IsSameObject函数:从函数名称上就可以看出是判断两个对象是否是同一个对象
3.IsInstanceOf函数:判断一个对象是否是一个类的实例
4.GetSuperclass函数:获取一个jclass的父jclass
说明:
1.SetField函数中是根据属性数据类型变化的,例如数据类型为int,那么函数就是SetIntField函数
具体如下图:
八种基本数据类型都有对应的方法,其他引用类型统一使用SetObjectFiled函数,看上面第二图,有set当然也有get啦
如果是静态属性的话,jni也是提供好了:
2.CallMethod函数中是根据返回值变化的,例如返回值为int,则函数为CallIntMethod
具体如下图:
如上两图,每个方法都有附属两个版本——带V版和带A版,这个不是重点,先忽略他们。
可以发现的取值就是八种基本数据类型、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! ~~
java jni 方法描述,五、JNI提供的函数介绍(一):类和对象操作相关推荐
- JNI开发笔记(五)--JNI语法总结
JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...
- 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )
文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...
- 不应该通过类实例访问静态成员 解决方法_今天说一说php中的类与对象
网上的文章博客这种东西已经写烂了. 我只是写写自己理解.... 首先都知道php的面向对象,什么封装,集成,多态,灵活,简单,代码简洁,重用行强,利于维护,什么什么三个方向:灵活性,重用行,扩展性. ...
- JAVA类与对象构造方法,java基础-1-面向对象(1)-概念介绍与类、对象、构造方法...
-------android培训.java培训.期待与您交流! ---------- 什么叫做面向对象? 想要了解什么事面向对象,我们首先需要了解,什么是面向过程. 所谓的面向过程,指的是在编程期间, ...
- Java入门姿势【面向对象:1】啥事面向对象、类和对象如何理解
面向对象是编程开发的一种编程范式. 这次我们来详细了解一下Java面向对象,面向对象的思想已经涉及到软件开发的各个方面,如:面向对象的分析,面向对象的设计.以及我们经常说的面向对象的编程实现 其余的一 ...
- java so jnienv_JNI初步(五)jni ndk 一个.so文件依赖另一个.so文件的写法
注意:本文是在ndk环境下编写 1.写native类声明native方法 package com.godv.audiosuc; public class NativePlayers { static{ ...
- Java 8 方法引用 (Method Reference)快速介绍与示例
Method Reference 是什么? Method Reference 是Java 8 才开始提供的新特性, 翻译过来是方法引用. 其定义就是: 把已经定义好的名字和方法, 当做Lambda 表 ...
- java getbean方法_java相关:spring中通过ApplicationContext getBean获取注入对象的方法实例...
java相关:spring中通过ApplicationContext getBean获取注入对象的方法实例 发布于 2020-12-19| 复制链接 分享一篇关于关于spring中通过Applicat ...
- 《JAVA编程那点事儿》读书笔记(二)——类和对象
方法: 1. 基本的main方法: public static void main(String[] args) 2.静态方法内部调用非静态方法:重新声明一个类,通过这个类来调用非静态方法 1 pub ...
最新文章
- 模式识别之车牌识别---一个开源车牌识别项目easypr
- 光纤收发器元器件指标详情
- Vue模板语法---vue工作笔记0003
- python complex 如何取出实数部分_【PYthon报错】np.complex128数字的虚数部分为0j
- 面试阿里Java工程师归来总结面经,已成功斩获P6 offer
- 远程计算机统考试题,2015年电大远程网络教育计算机应用基础统考模拟试题集...
- 2023秋招大厂经典面试题及答案整理归纳(241-260)校招必看
- win10、ubuntu系统设置CPU高性能模式、卓越性能
- 编程入门先学什么 c语言软件,编程入门先学什么软件
- 计算机中常用术语CAD是指,计算机常用术语CAD的含义是
- 吉盟珠宝:300家门店异地沟通 效率居然远超“面对面”
- servlet3 文件上传
- Android:如何优雅的开发马甲包?
- App隐私合规协议(第三方SDK)说明
- 2019年英语四级作文
- 10个致工程师在工作中快速成长的技巧
- 软件工程基础个人项目——数独(5)
- 沃云服务器上部署web项目(亲试)!
- hive正则匹配:regexp_replace、regexp_extract、regexp
- 估值调整 - Quanto 调整