文档章节

四、JNI数据类型

unic0rn
 unic0rn
发布于 2016/07/14 16:31
字数 1093
阅读 21
收藏 1
点赞 0
评论 0
jni

    Java和C使用JNI通信,所谓通信是指数据上的传递,当Java传递一个String类型给C,C要如何处理?JNI对此提供了一套中间的数据类型。

  1. 基本数据类型
  2. 引用数据类型
  3. 数据类型继承关系
  4. 类描述符
  5. 域描述符
  6. 方法描述符
  7. javap查看方法签名

 

JNI数据类型也分为基本数据类型和引用数据类型

数组都是引用类型,引用类型不能直接使用,要经过JNI函数转换才能使用

 

1.基本数据类型:

JNI

Java

C/C++

jlong

long

有符号64位整型(long)

jint

int

有符号32位整型(int)

jboolean

boolean

无符号8位整型(unsigned char)

jfloat

float

32位浮点型(float)

jdouble

double

64位浮点型(double)

jbyte

byte

有符号8位整型(char)

jshort

short

有符号16位整型(short)

jchar

char

无符号16位整型(unsigned short)

 

2.引用数据类型:

JNI

Java

C/C++

jobject

Object

任何Java对象或没有对应Java类型的对象

jclass

Class

Class类对象

jstring

String

字符串对象

jobjectArray

Object[]

任何对象数组

jbooleanArray

boolean[]

布尔型数组

jbyteArray

byte[]

比特型数组

jcharArray

char[]

字符型数组

jshortArray

short[]

短整型数组

jintArray

int[]

整型数组

jlongArray

long[]

长整型数组

jfloatArray

float[]

浮点型数组

jdoubleArray

double[]

双浮点型数组

void

void

n/a

 

3.数据类型继承关系

 

4.类描述符

 

如果在一个本地方法中,我们要返回一个自定义的User对象怎么办?C中怎么找到Java中的User类?

JNI提供的函数中有个FindClass()就是用来查找Java类的,其参数必须放入一个类描述符字符串

例如User类完整类名为qrsoft.org.User,那么类描述符就是将完整类名的.全部换成/  =>   "qrsoft/org/User"

那么找到User类的代码就是如下:

    jclass userClass = FindClass("qrsoft/org/User");

 

5.域描述符

 

事实证明,FindClass使用域描述也是可行的,即:

jclass userClass = FindClass("qrsoft/org/User"); 

等同jclass userClass = FindClass("Lqrsoft/org/User;"); 

 

什么是域描述符?

域描述符是JNI中对Java数据类型的一种表示方法,虽然有类描述符,但是类描述符里并没有说明基本类型如何表示

在域描述符中已经定义好了基本类型的表示:

 

 

域描述符也定义了数组类型的表示方法:

数组类型的描述符为: [ + 其元素类型的域描述符

如:int[] 描述符为 [I

float[] 描述符为 [F

String[] 描述符为 [Ljava/lang/String;

n维数组就有几个[ + 其元素类型的域描述符

如:int[][] 描述符为 [[I

float[][] 描述符为 [[F

 

如果要表示其他类,如同上面String类型一样,引用数据类型为 L + 该类类描述符 + ;

如 Lqrsoft/org/User;

Ljava/lang/String;

 

 

6.方法描述符

 

方法描述符定义了方法的返回值和参数的表示形式

将参数类型的域描述符按声明顺序放入一对括号中(如果没有参数则不需要括号),括号后跟返回值类型的域描述符即形成方法描述符

 

如:

String test();        方法描述符 Ljava/lang/String;

int f(int i, Object object);    方法描述符 (ILjava/lang/Object;)I

void set(byte[] bytes);        方法描述符 ([B)V

 

注意,如果返回值为void,那么方法描述符中使用V表示

 

打开javah生成的头文件,你会发现javah头文件注释中已经生成了本地方法的方法描述符->Signature,所以方法描述符也可以叫做 签名

 

7.javap查看方法签名

javap是jdk自带的一个反编译工具,也可以查看java编译器生成的字节码,在此我们只利用他查看Java方法签名

他的用法如同javah,但命令不同

执行命令javap -s qrsoft.org.Test

你可以查看到该类所有方法签名

 

 

javap也可以配置在eclipse中快捷使用,配置如javah一样,但配置不同

javah配置如下:

 加我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(一)——NDK与JNI基础

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

隔壁老李头
05/09
0
0
Android深入理解JNI(二)类型转换、方法签名和JNIEnv

相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换、方法签名和JNIEnv。 1.数据类型的转换 首先给出上一篇文章中and...

刘望舒
2017/07/03
0
0
Android NDK开发之Jni的数据类型

在前面的一篇博客《Android NDK开发简介》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。 JNI是Java代码和C/C++代码通信的桥...

zhiweiofli
2013/03/15
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
深入理解JNI

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

xiaole0313
2016/03/31
0
0
Android平台上的JNI技术介绍

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

ChowJames
2012/10/01
0
0
NDK开发系列之——Jni数据类型

在NDK开发调用jni函数时,信息基本都是通过数据传递来实现。而且jni接口特别高冷,只要稍微 哪里不对,就会崩溃,把人都要整崩溃。我刚开始就时不时因为一个字母大小写错了,少写一个分号,怎...

翻滚吧李博
2017/12/08
0
0
NDK开发中这些基本知识你都懂吗

JNIEnv 定义: 相当于一个jni上下文对象。 作用: 通过JNIEnv的指针能够对Java端的代码进行操作: a.创建Java对象. jstring str = (env).NewStringUTF("终端研发部"); jclass jclazz = (env)...

codeGoogle
2017/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
15分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部