`
zhiweiofli
  • 浏览: 515015 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android NDK开发之Jni的数据类型

阅读更多

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

JNI是Java代码和C/C++代码通信的桥梁,其角色在某种意义上就是一个翻译员,从设计模式来看叫适配器。

两者的沟通,首要的一定要对嘴型,对channel,沟通才能到位。计算机程序的基本组成,从狭义来讲,就是数据结构+算法。由于Java和C/C++是两种不同的编程语言,它们各自拥有自家定义的数据类型和结构。JNI的第一步就是统一转换其中一方的数据类型,这就好比我们跟外国友人沟通,我们得说英语一样子。下表是Java的8大基本类型,在Jni层对应的数据描述:

Java  Native(jni.h)
boolean  jboolean
byte  jbyte
char  jchar
short  jshort
int jint
long  jlong
float jfloat
double  jdouble

 

复杂一点的对象类型,其对应的数据描述如下图:

这里补充说明一下:

  1. Java中的返回值void和JNI中的void是完全对应的 
  2. Java中的基本数据类型(boolean, byte, char, short, int, long, float, double),在JNI中对应的数据类型只要在前面加上 j 就对应了(jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble) 
  3.  Java中的对象,包括类库中定义的类、接口以及自定义的类接口,都对应于JNI中的 jobject
  4.  Java中基本数据类型的数组对应与JNI中的 jarray 类型。(type就是上面说的8种基本数据类型)
  5.  Java中对象的数组对应于JNI中的 jobjectArray 类型。(在Java中一切对象、接口以及数组都是对象)

关于数据类型的转换,JNI还提供的强悍的函数库来支持。对于基本的类型的转换,我们先来复习一下,先关注一下Java基本类型的精度。

类型 字节数 范围/精度
float 4 32位IEEE754单精度
double 8 64位IEEE754双精度
byte 1 -128到127
short 2 -32,768到32,767
int 4 -2,147,483,648到2,147,483,647
long 8 -9,223,372,036,854,775,808到9,223,372,036,854,775,807
char 2 整个Unicode字符集
boolean 1 True或者false

 

Java 的基本数据类型是不存在有符号和无符号这种概念的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。

      像 byte 的范围是 -128 到 127,你想要变为 0到255 怎么办,,跟 0XFF 做与运算就可以了:b & 0XFF 

      如 byte b ,如果你想赋值它值 255,那是不行的, 就算赋值了,b的值也是 255 对 256 求模后的值 -1,即 b = -1,  然后 b & 0XFF 结果即为 255,这个与运算后的结果会隐式转换为int 类型的, 因为 byte 放不下了,与运算还是很快的,,比加减法还快的。 

所以Jni层使用Java的基本类型数据,对于上面八种基本的数据类型,jni层的c/c++代码可以用强制直接转换成对应长度的c/c++类型数据。

如:unsigned char tmp = (unsigned char) m_jboolean;        
     unsigned short tmp = (unsigned short) m_jchar;        
或者同长度类型的数据,可以直接赋值,int tmp = m_jint;

 

 

关于Jni操作对象类型或更复杂数据类型的说明,请留意之后的博客。

 

本文转自Zhiweiofli's Blog,转载请注明出处,谢谢。

0
0
分享到:
评论
1 楼 dirweb1987 2014-03-19  
[img][list]
[*]
引用
[u][i][b][/b][/i][/u]

[/list][/img]

相关推荐

    Android NDK编写之JNI规范升级版

    在Android开发中,NDK(Native Development Kit)和JNI(Java Native Interface)是两个关键工具,它们允许开发者使用C++或者其他本地语言编写部分代码,从而提高应用的性能或实现特定功能。本文将深入探讨Android ...

    androidndk开发实战

    《Android NDK开发实战》是针对移动应用开发者的一份宝贵资源,主要涵盖了如何在Android平台上进行原生代码开发。NDK(Native Development Kit)是Google为Android提供的一个工具集,它允许开发者使用C和C++编写性能...

    NDK开发 之JNI 文档

    4. **数据类型转换**:JNI提供了一套数据类型,如`jobject`、`jint`、`jstring`等,用于在Java和本地代码之间转换数据。例如,`jstring`可以用来处理Java的`String`类型,`jobject`可以代表任何Java对象。 5. **...

    Android NDK 开发教程及JNI教程.zip

    Android NDK和JNI是Android平台下进行原生代码开发的重要工具,主要面向希望利用C/C++等低级语言实现高效能计算或者复用已有的C库的开发者。本教程将详细解析这两个技术,并通过实例帮助你掌握它们的核心概念和应用...

    Android studio NDK,JNI开发

    Android Studio NDK与JNI开发是Android应用开发中的高级技术,主要用于实现Java代码与原生C/C++代码的交互。NDK(Native Development Kit)是一套工具集,它允许开发者使用C/C++编写部分应用程序,以利用其高性能和...

    Android NDK JNI 开发

    Android NDK JNI 开发是移动应用开发中的一个重要领域,它允许开发者使用C++和其他原生语言来编写部分Android应用程序,从而提升性能、利用硬件加速以及复用现有的C/C++库。JNI(Java Native Interface)是Java平台...

    Android NDK+JNI 练习1

    在"JNIPractice01"这个练习中,你可能会遇到如何设置JNI环境、如何定义本地方法、如何在C代码中调用Java方法以及如何处理跨语言交互时的数据类型转换等问题。理解这些概念和操作是成功实现Android NDK+JNI集成的关键...

    Android ndk jni 史上最强NDK入门项目实战

    在移动开发领域,Android NDK(Native Development Kit)和JNI(Java Native Interface)是开发者用来实现高性能计算、利用硬件加速或调用C/C++库的重要工具。本指南将深入浅出地介绍这两个概念,通过实际项目实战,...

    Android NDK 开发的官方文档(android ndk dev guide)

    JNI是Android应用与原生代码交互的关键,它定义了一组接口和数据类型,使得Java代码可以调用C/C++函数,反之亦然。在JNI中,你需要编写Java层的本地方法声明,并在C/C++层实现这些方法。通过JNI头文件自动生成工具,...

    free pascal (lazarus) 版的 android NDK (JNI)调用范例、数据类型转换示例

    2. **数据类型转换**: - **字符与字符串**:Java的`char`类型在C/C++中对应`jchar`,字符串是`jstring`。在Free Pascal中,可以使用`JNIEnv`指针的`GetStringUTFChars()`和`ReleaseStringUTFChars()`方法获取和...

    jni数据类型转换

    jni数据类型转换例程 1. java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5....

    JNI NDK 开发指南

    5. **数据类型转换**:JNI提供了Java与C/C++之间数据类型的映射,例如`jint`对应`int`,`jobject`对应Java对象引用等。 6. **调用Java方法**:在本地代码中,可以使用`JNIEnv`指针调用Java方法,包括静态方法(`...

    Android NDK+JNI 练习2

    当Java代码通过JNI调用这些函数时,NDK会处理必要的上下文切换和数据类型转换,使得Java和本地代码能有效地通信。 在"Android NDK+JNI 练习2"中,我们的目标是在C代码中创建Java对象。这个过程分为几个步骤: 1. *...

    android ndk jni demo source code

    Android NDK和JNI是Android应用开发中的重要组成部分,它们允许开发者使用C++或者其他原生代码来实现性能敏感或需要高效计算的部分。这个"android ndk jni demo source code"是针对这一主题的一个示例项目,它已经...

    Android Studio JNI_NDK开发实例

    - JNI头文件`jni.h`定义了各种数据类型、函数原型和宏,帮助开发者创建本地方法。 2. **NDK介绍**: - NDK包含一组工具,用于编译、链接和打包C/C++代码,使其能在Android设备上运行。 - NDK提供了预编译的库,...

    Android Studio JNI/NDK 编程

    3. **数据类型转换**:JNI提供了Java和C/C++数据类型的映射,例如`jint`对应`int`,`jobject`对应Java对象引用等。 4. **异常处理**:JNI支持检测和抛出Java异常,确保在本地代码中正确处理错误。 5. **内存管理**...

    Android_NDK_android端_图片处理_android_NDK_ndk开发_

    返回值可以通过`jobject`类型(如Bitmap)或基本数据类型返回。同时,需要处理异常,确保在原生代码中出现错误时能正确传递回Java层。 7. **构建流程** 使用Android Studio,可以配置CMake或ndk-build脚本来编译...

    Android NDK基础开发

    Android NDK(Native Development Kit)是Google为Android平台提供的一款工具集,允许开发者在Android应用中使用C++和其它本地语言进行开发。NDK的主要功能是实现原生代码的编译,提供性能优化、硬件加速以及使用...

    android C/C++ JNI普通数据类型 测试工程

    当Java层调用C/C++的本地方法时,参数会被自动转换为对应的JNI数据类型。例如,如果你有一个Java方法: ```java public native void passInt(int value); ``` 在C/C++中,你需要定义对应的本地方法: ```c++ ...

    NDK JNI的学习

    - Java数据类型与JNI数据类型的对应关系是学习JNI的基础,例如,`int`在JNI中对应`jint`,`String`对应`jstring`,对象数组对应` jobjectArray`等。 - JNI提供了丰富的函数用于在Java和C/C++之间传递数据,如`Get...

Global site tag (gtag.js) - Google Analytics