文档章节

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

unic0rn
 unic0rn
发布于 2016/07/14 16:37
字数 926
阅读 42
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Memcached启动参数详解

memcached -d -m 1024 -l 192.168.100.101 -p 11211 -P /tmp/memcached.pid -c 1024 -f 1.25 -n 80 -t 16 运行参数描述 -d:以守护(daemon)进程方式启动; -u:是运行Memcache的用户,例如 ......

月下狼
17分钟前
0
0
xgboost-kaggle

https://www.kaggle.com/dansbecker/xgboost This tutorial is part of the Learn Machine Learning series. In this step, you will learn how to build and optimize models with the powe......

tantexian
18分钟前
0
0
nginx学习八 代理服务

最常用的语法 proxy_pass Syntax: proxy_pass URL;Default: --Context:location.if in location,limit_exception 反向代理 例:/etc/nginx/conf.d/default.conf 反向代理(代理服务端)......

Romanceling
25分钟前
0
0
npm ERR! Unexpected end of JSON ...

npm install 报错: npm ERR! Unexpected end of JSON input while parsing near '..."^2.8.14"},"_hasShrin' npm ERR! A complete log of this run can be found in: ... 打开终端 命令: 第......

大_侠
29分钟前
0
0
Android中的设计模式之责任链模式

参考 《设计模式:可复用面向对象软件的基础 》5.1 Chain of responsibility 职责链 对象行为型模式 《Android源码设计模式解析与实战》第9章 使编程更有灵活性--责任链模式 意图 使多个对象...

newtrek
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部