本文我们来讨论一下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. 制作docker基础镜像

    docker build -t tomcat:jre8-alpine . sudo docker tag 5a3 registry.cn-shenzhen.aliyuncs.com/ibase/tom ...

  2. 51-迷宫(一)- java版dfs和bfs

    一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头君是否有可以逃出去的路. 输入格式 第一行输入两个整数 nn ...

  3. 使用Fiddle对夜神模拟器进行抓包的设置

    注意: 设置完后, 不开启 Fiddle 的话,模拟器就不能上网了.  可以通过再把网络配置 改回去 就可以恢复网络正常访问了 一.配置Fiddle参数设置 1.Tools->Options 2 ...

  4. Apollo

    下载源码: https://github.com/nobodyiam/apollo-build-scripts#%E4%B8%80%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9 ...

  5. 【Java】a++,++a 区分记忆

    写了个例子测试: package com.xdsux.java.basetest; public class BaseTest1 { public static void main(String[] ...

  6. sql中varchar(n),nvarchar(n) 长度性能及所占空间分析

    sql中varchar(n),nvarchar(n) 长度性能及所占空间分析 1.varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. ...

  7. python 调用shell hive sql

    def generate_csv_source(data_file): #判断文件是否存在 if not os.path.exists(data_file): # 拉取hive表数据 cmd_sql ...

  8. 递归打印lua中的table

    在lua中,table是比较常用的数据形式,有时候为了打印出里面的内容,需要做一些特殊处理. 废话不多讲,直接粘代码: print = release_print -- 递归打印table local ...

  9. 实战操作——通过wireshark查看任意qq好友IP

    今天有群里好友问我如何查看别人IP,查IP这个东西对于一些刚入门的小白来说可能是一个比较高大上的玩意,但是实际上只需一个网络协议分析工具就OK,废话不多说,下面开始实践 实验对象:任意QQ好友 操作工 ...

  10. vue中集成pdfjs自定义分页

    <template> <div id="div_read_area_scrool" class="no-scrollbar--x" :styl ...