转:http://blog.csdn.net/qinjuning/article/details/7599796
在Java存在两种数据类型: 基本类型 和 引用类型 。
在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下:
1、primitive types ----基本数据类型,如:int、 float 、char等基本类型
2、reference types----引用类型,如:类、实例、数组。
特别需要注意:数组 ------ 不管是对象数组还是基本类型数组,都作为reference types存在。
1、primitive types (基本数据类型)映射参见下表:
这些基本数据类型都是可以在Native层直接使用的 。
2、reference types (引用数据类型)映射参见下表
Java类型 Native Type 描述
注意:
1、引用数据类型则不能直接使用,需要根据JNI函数进行相应的转换后,才能使用
2、多维数组(包括二维数组)都是引用类型,需要使用 jobjectArray 类型存取其值 ;
例如:二维整型数组就是指向一位数组的数组,其声明使用方式如下:
- //获得一维数组 的类引用,即jintArray类型
- jclass intArrayClass = env->FindClass("[I");
- //构造一个指向jintArray类一维数组的对象数组,该对象数组初始大小为dimion
- jobjectArray obejctIntArray = env->NewObjectArray(dimion ,intArrayClass , NULL);
- ...//具体操作
另外,关于引用类型的一个继承关系如下,我们可以对具有父子关系的类型进行转换:
类描述符
类描述符是类的完整名称(包名+类名),将原来的 . 分隔符换成 / 分隔符。
例如:在java代码中的java.lang.String类的类描述符就是java/lang/String
其实,在实践中,我发现可以直接用该类型的域描述符取代,也是可以成功的。
例如: jclass intArrCls = env->FindClass("java/lang/String")
等同于 jclass intArrCls = env->FindClass("Ljava/lang/String;")
数组类型的描述符则为,则为: [ + 其类型的域描述符 (后文说明)
例如:
int [ ] 其描述符为[I
float [ ] 其描述符为[F
String [ ] 其描述符为[Ljava/lang/String;
域描述符
1、基本类型的描述符已经被定义好了,如下表所示:
2、引用类型的描述符
一般引用类型则为 L + 该类型类描述符 + ; (注意,这儿的分号“;”只得是JNI的一部分,而不是我们汉语中的分段,下同)
例如:String类型的域描述符为 Ljava/lang/String;
对于数组,其为 : [ + 其类型的域描述符 + ;
int[ ] 其描述符为[I
float[ ] 其描述符为[F
String[ ] 其描述符为[Ljava/lang/String;
Object[ ]类型的域描述符为[Ljava/lang/Object;
多维数组则是 n个[ +该类型的域描述符 , N代表的是几维数组。例如:
int [ ][ ] 其描述符为[[I
float[ ][ ] 其描述符为[[F
方法描述符
将参数类型的域描述符按照申明顺序放入一对括号中后跟返回值类型的域描述符,规则如下: (参数的域描述符的叠加)返回
类型描述符。对于,没有返回值的,用V(表示void型)表示。举例如下:
Java层方法 JNI函数签名
String test ( ) Ljava/lang/String;
int f (int i, Object object) (ILjava/lang/Object;)I
void set (byte[ ] bytes) ([B)V
在编程时,如果是利用javah工具的话,这些都不需要我们手动编写对应的类型转换,如果不能用javah工具,就只能手动的
进行类型转换了。
相关推荐
学习c语言的一些代码,为学习JNI做准备!学习c语言的一些代码,为学习JNI做准备!学习c语言的一些代码,为学习JNI做准备!学习c语言的一些代码,为学习JNI做准备!学习c语言的一些代码,为学习JNI做准备!学习c语言...
本项目"JniDemo Android调用C语言"提供了一个完整的示例,展示了如何在Android Studio环境中利用JNI调用C语言代码。 首先,我们来理解一下JNI的基本概念。JNI是Java虚拟机(JVM)和本地代码之间的桥梁,它定义了一...
下面将详细阐述Android JNI、C语言在Android中的应用以及如何实现文件的读写。 首先,我们需要了解JNI的基本概念。JNI是Android提供的一种接口,使得Java应用程序可以调用C/C++编写的原生代码。这在需要高性能计算...
JNI完全技术手册,C语言与Java互操作 JNI(Java Native Interface)是一种允许Java代码与本地应用程序交互的技术,允许开发者使用Java语言调用C语言编写的本地代码,从而实现Java应用程序与操作系统之间的交互。本...
4. **实现过程**:创建一个JNI函数库,定义Java层的接口,并在本地代码中实现I2C的初始化、发送数据、接收数据等功能。在Android应用中,通过Java层的接口调用这些本地函数,完成与I2C设备的通信。 5. **开发环境**...
Java通过JNI(Java Native Interface)调用C语言函数库是一种常见的技术实践,它允许Java程序直接与本地操作系统和硬件交互,提高性能或者利用已有的C/C++代码库。本资料"Java通过JNI调用C语言函数库的方法.zip"提供...
安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip
这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C 调 Java、Java 调 C)基本运算、方法调用、字符串连接的效率测试结果。 一、JNI 调用效率测试 在 Android G1 环境中,JNI 调用效率测试结果表明,无论是 ...
### JNI 获取 Java 窗口句柄的 C 语言源代码解析 #### 一、引言 JNI(Java Native Interface)是一种允许Java代码调用本地应用程序接口(Native Application Programming Interfaces,如 C 或 C++ 代码)的方法。...
本篇将详细介绍如何使用JNI调用C语言来实现特定的功能。 首先,理解JNI的基本概念是关键。JNI提供了一种机制,让Java虚拟机(JVM)能够调用本地(Native)代码,也就是非Java语言编写的代码,通常是C或C++。这个...
在这个"Java jni调用c实例"中,我们将深入探讨如何通过JNI在Java应用程序中调用C语言编写的函数。 首先,我们需要了解JNI的基本结构。一个典型的JNI程序包括Java源代码、C/C++源代码以及对应的头文件。Java源代码中...
总结来说,JNI调用本地C语言的过程包括:编写Java类声明本地方法、生成C语言头文件、实现C/C++源代码、配置编译环境、编译生成DLL库,并确保Java程序能够正确加载和调用这个库。这个过程使得Java开发者可以充分利用...
在实际开发中,还需要注意一些细节,比如错误处理、内存管理(Java对象在本地代码中使用需要通过JNI函数创建和释放)、线程安全问题等。同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关...
在Java编程中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C和C++)进行交互。当我们需要高效地处理数据、利用特定平台的库或者优化性能时,JNI就显得尤为重要。本文将深入探讨...
在Java中,使用JNI可以访问本地方法,这些方法是用C、C++等原生语言编写的。这在需要高效计算或者利用操作系统特定功能时非常有用。 在这个例子中,我们有一个简单的计算器,它的核心计算逻辑位于C语言编写的.so...
### JNI中C和Java参数传递详解 #### 一、引言 Java Native Interface (JNI) 是Java平台标准的一部分,用于让Java代码与其他语言写的代码进行交互。本文将深入探讨在JNI环境中,C/C++和Java之间如何进行参数传递,...
在Android项目中,JNI相关的代码通常被放在`src/main/jni`目录下,这里的源代码文件通常以`.c`或`.cpp`为扩展名。为了使Android构建系统能够处理这些原生代码,我们需要在`build.gradle`文件中添加对NDK的支持,并...
在这个“安卓 I2C JNI及测试 DEMO AS 源码”中,开发者可以学习如何在Android平台上利用JNI技术来操作I2C总线,与硬件设备进行直接通信。 1. **I2C简介** - I2C协议是由飞利浦(现NXP半导体)开发的一种串行通信...
使用java调用c语言编写的so/dll/sl文件。使用java调用c语言编写的so/dll/sl文件。详细介绍: http://blog.csdn.net/liu251/archive/2009/03/03/3953906.aspx 如果有疑问,可以给我留言。
在Android开发中,JNI被广泛用于实现性能敏感的模块,如图像处理、音视频编码等,同时也可用于调用系统底层服务或者利用硬件特性。本篇文章将深入探讨如何在JNI中实现C代码回调Java的方法。 ### 1. JNI基础 JNI...