本文我们来讨论一下JNI如何将Java类型映射到本机C类型。

一、基本数据类型

如下图表整理了Java基本类型和native对应的关系:

Java类型 Native类型 描述
boolean jboolean unsigned 8 bits
byte jbyte signed 8 bits
char jchar unsigned 16 bits
short jshort signed 16 bits
int jint signed 32 bits
long jlong signed 64 bits
float jfloat 32 bits
double jdouble 64 bits
void void N/A

二、引用类型

JNI 包含许多与不同类型的Java对象相对应的引用类型。JNI引用类型按层次结构组织,如图所示:

在C中,所有其他JNI引用类型都定义为与jobject相同。例如:

typedef jobject jclass; 

在C ++中,JNI引入了一组虚拟类来强制执行子类型关系。例如:

class _jobject {};
class _jclass : public _jobject {};
...
typedef _jobject *jobject;
typedef _jclass *jclass;

三、字段和方法ID

方法和字段ID是常规C指针类型:

struct _jfieldID;              /* opaque structure */
typedef struct _jfieldID *jfieldID; /* field IDs */ struct _jmethodID; /* opaque structure */
typedef struct _jmethodID *jmethodID; /* method IDs */

四、类型签名

JNI 使用Java VM的类型签名表示。下图显示了这些类型的签名:

类型签名 Java类型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class ; fully-qualified-class
[ type type[]
( arg-types ) ret-type method type
 

举个例子,Java方法:

long f (int n, String s, int[] arr); 

对应的方法类型签名为:

(ILjava/lang/String;[I)J 

Android JNI 学习(三):JNI 数据类型和数据结构的更多相关文章

  1. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  2. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. Lua学习三----------Lua数据类型

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua数据类型 - Lua是动态类型语言,不需要为变量定义类型,只需要为变量赋值 - Lua有8中基本数据类型:nil.boolean.number. ...

  4. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  6. android学习笔记----JNI中的c控制java

    面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解 ...

  7. Android JNI和NDK学习(06)--JNI的数据类型(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094037.html 本文介绍JNI的数据类型.NDK中关于JNI数据类型的 ...

  8. Android NDK开发之Jni的数据类型

    在前面的一篇博客<Android NDK开发简介>,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发.今天我再详细说明一下自己的学习经验. JNI是Java ...

  9. Android JNI 学习(二):JNI 设计机制

    本章我们重点说明以下JNI设计的问题,本章中提到的大多数设计问题都与native方法有关.至于调用相关的API的设计,我们会在后面进行介绍. 一.JNI接口函数和指针 native 代码通过调用JNI ...

随机推荐

  1. Android Studio 的 build 过程

    如图, 编译器将源代码(包括 Application Module 及其所依赖的所有 Library 源代码)转换成 DEX(Dalvik Executable)文件(其中包括运行在 Android ...

  2. VS code 代码格式整理的配置

    { "workbench.iconTheme": "material-icon-theme", "vetur.validation.template& ...

  3. matplotlib -- 基础知识

    matplotlib 组织图表的方式 最上层是一个 Figure 实例,包含了所有可见的和其他一些不可见的内容.该 Figure 实例包含了一个 Axes 实例的成员属性 Figure.axes,同时 ...

  4. 利用WMITool解决Windows10 浏览器主页被hao123劫持问题

    利用Windows10 激活工具KMS10_1025激活系统之后会出现首页 被劫持的问题 解决办法如下 1.下载wmi tool 连接地址 链接: https://pan.baidu.com/s/1g ...

  5. day32 进程

    上午: # 1 开启子进程 #target #args # if __name__ == '__main__' #start() # 2.其它的方法: #方法: #terminate() #is_al ...

  6. Liang-Barsky直线段裁剪算法

    Liang-Barsky直线段裁剪算法 梁友栋与Barsky提出的裁剪算法以直线的参数方程为基础,把判断直线段与窗口边界求交的 二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题.设起点为 ...

  7. 前台js接收后台的json数据

    后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...

  8. oracle 恢复table删除数据 恢复package(使用闪回)

    好久没写东西了,今天写一篇凑个数吧,来公司一年多了,感觉自己到了一个小瓶颈期了. 以前每天很多新东西,都是忙着学,感觉没时间写博客总结一下,大部分都是写笔记,现在又是没东西可以写,每天干着95%都是重 ...

  9. SolrCloud的搭建与稳定性测试

    转载请注明出处:http://www.cnblogs.com/wubdut/p/7573738.html 一.集群搭建 1. zookeeper搭建(版本:3.4) 1.1 zoo.cfg配置文件: ...

  10. git的命令行操作

    1.初始化本地的git仓库git init,代码存放在这里,git会自动对我们的代码进行管理备份. 2.设置用户信息,设置用户名:git config --global user.name " ...