JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)
使用JNI的副作用
一旦使用JNI,JAVA程序就丧失了JAVA平台的两个优点:
- 程序不再跨平台。要想跨平台,必须在不同的系统环境下重新编译本地语言部分。
- 程序不再是绝对安全的,本地代码的不当使用可能导致整个程序崩溃。一个通用规则是,你应该让本地方法集中在少数几个类当中。这样就降低了JAVA和C之间的耦合性。
数据类型映射
在Java存在两种数据类型:基本类型和引用类型(primitive types 和reference types)
在JNI中也同样存在类似类型的映射
基本类型映射表
Java类型 | 本地C类型(NativeType) | 实际表示的c类型 | 说明 |
---|---|---|---|
boolean | jboolean | unsigned char | |
byte | jbyte | signed char | |
char | jchar | unsigned char | |
short | jshort | unsigned short | |
int | jint | long | 有符号,32 位 |
long | jlong | __int64 | 有符号,64 位 |
float | jfloat | float | |
double | jdouble | double | |
void | void | N/A |
引用类型映射表
Java类型 | 本地C类型(NativeType) | 说明 |
---|---|---|
Object | jobject | Class类对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 对象数组 |
boolean[] | jbooleanArray | 布尔类型数组 |
byte[] | jbyteArray | |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | |
int[] | jintArray | |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | |
double[] | jdoubleArray | 双精度浮点型数组 |
注意
- 基本类型在Native层可以直接引用
- 引用数据类型则不能直接使用,需要根据JNI函数进行相应的转换后,才能使用
- 多维数组(包括二维数组)都是引用类型,需要使用 jobjectArray 类型存取其值 ;
描述符
类描述符
是类的完整名称(包名+类名),将原来的 . 分隔符换成 / 分隔符。
如在java代码中的java.lang.String类的类描述符就是java/lang/String
域描述符
1. 基本类型的域描述符已经定义好
Java语言类型 | 域描述符 |
---|---|
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | J(?为什么不是L) |
float | F |
double | D |
2. 引用类型的描述符
-
一般引用类型则为 L + 该类型类描述符 + “;” 。
例如:String类型的域描述符为 Ljava/lang/String;
-
对于数组,其为 : [ + 其类型的域描述符 + ;
int[ ] 其描述符为[I
float[ ] 其描述符为[F
String[ ] 其描述符为[Ljava/lang/String;
Object[ ]类型的域描述符为[Ljava/lang/Object;
-
多维数组则是 n个[ +该类型的域描述符 , N代表的是几维数组。例如:
int [ ][ ] 其描述符为[[I
float[ ][ ] 其描述符为[[F