Android NDK开发之旅(3):详解JNI数据类型与C/C++、Java之间的互调
(码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/details/72851294)
1. JNI数据类型
JNI,Java NativeInterface,是一种为Java编写本地方法和JVM嵌入本地应用程序标准的应用程序接口,它允许运行在JVM上的Java代码能够与C/C++实现的本地库进行交互。
(1) JNI数据类型
Java中有两种类型:基本数据类型(int、float、char等)和引用类型(类、对象、数组等)。JNI定义了一个C/C++类型的集合,集合中每一个类型对应于Java中的每一个类型,其中,对于基本类型而言,JNI与Java之间的映射是一对一的,比如Java中的int类型直接对应于C/C++中的jint;而对引用类型的处理却是不同的,JNI把Java中的对象当作一个C指针传递到本地函数中,这个指针指向JVM中的内部数据结构,而内部数据结构在内存中的存储方式是不可见的,本地代码必须通过在JNIEnv中选择适当的JNI函数来操作JVM中的对象。比如,对于java.lang.String对应的JNI类型是jstring,但本地代码只能通过GetStringUTFChars这样的JNI函数来访问字符串的内容。以下是JNI数据类型映射关系表,通过这种映射JNI就可以正确识别并转换Java数据类型:
映射 类型 |
Java类型 |
JNI本地类型 |
C类型 |
||||
type/bits |
type/bits/signatures |
type/bits |
|||||
基本 类型 |
boolean |
8 |
jboolean |
u8 |
Z |
- |
|
byte |
8 |
jbyte |
8 |
B |
- |
|
|
char |
16 |
jchar |
u16 |
C |
char |
8 |
|
short |
16 |
jshort |
16 |
S |
short |
16 |
|
int |
32 |
jint |
32 |
I |
int |
32 |
|
long |
64 |
jlong |
64 |
J |
long |
32 |
|
float |
32 |
jfloat |