目的
主要是在使用JNI的时候, 经常有些基本内容要去网上找, 有时比较繁琐, 故在此记录
一些重要的网址
Java, jni 与 c++ 数据类型对照图
基本数据类型:
Java类型 | Jni类型 | c++类型 | 描述 |
---|---|---|---|
boolean | jboolean | unsigned char | 无符号8位整数 |
byte | jbyte | signed char | 有符号8位整数 |
char | jchar | unsigned short | 无符号16位整数 |
short | jshort | signed short | 有符号16位整数 |
int | jint | signed int | 有符号32位整数 |
long | jlong | long long | 有符号64位整数 |
float | jfloat | float | 有符号32位浮点数 |
double | jdouble | double | 有符号64位浮点数 |
对象类型:
Java类型 | Jni类型 | 描述 |
---|---|---|
Object | jobject | 任意Java对象 |
Class | jclass | Class 对象,Java类 |
String | jstring | 字符串对象 |
类型对应的签名:
native接口命名规则
对于传统的JNI编程来说,JNI方法跟Java类方法的名称之间有一定的对应关系,要遵循一定的命名规则,如下:
- 前缀: Java_
- 类的全限定名,用下划线
_
进行分隔, 如: com_lms_jni_JniTest - 方法名一般以小写开头, 一般函数名中间不使用下划线
_
, 如果使用下划线的话则可能需要使用动态注册方法,如:getTestString - jni函数指定第一个参数: JNIEnv *
- jni函数指定第二个参数: jobject
- 实际Java参数: jstring, jint ….
返回值的参数 : jstring, jint…. 所以对于在Java类 com.dasea.jni.JniDemo中的一个方法:
1
2public native String addTail(int, String tail, int);
public native String addTailOne(int, String tail, int[] arr);其对应的jni层的native函数声明如下:
1
2
3
4
5jstring Java_com_dasea_jni_JniDemo_addTail(JNIEnv* env, jobject obj, jint, jstring, jint);
// 函数签名: (ILjava/util/String;I)Ljava/util/String;
jstring Java_com_dasea_jni_JniDemo_addTail(JNIEnv* env, jobject obj, jint, jstring, jintArray);
// 函数签名: (ILjava/util/String;[I)Ljava/util/String;