NDK常用备份

目的

主要是在使用JNI的时候, 经常有些基本内容要去网上找, 有时比较繁琐, 故在此记录

一些重要的网址

关于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类方法的名称之间有一定的对应关系,要遵循一定的命名规则,如下:

  1. 前缀: Java_
  2. 类的全限定名,用下划线_进行分隔, 如: com_lms_jni_JniTest
  3. 方法名一般以小写开头, 一般函数名中间不使用下划线_, 如果使用下划线的话则可能需要使用动态注册方法,如:getTestString
  4. jni函数指定第一个参数: JNIEnv *
  5. jni函数指定第二个参数: jobject
  6. 实际Java参数: jstring, jint ….
  7. 返回值的参数 : jstring, jint…. 所以对于在Java类 com.dasea.jni.JniDemo中的一个方法:

    1
    2
    public native String addTail(int, String tail, int);
    public native String addTailOne(int, String tail, int[] arr);

    其对应的jni层的native函数声明如下:

    1
    2
    3
    4
    5
    jstring 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;