美文网首页
Android NDK(JNI)详解教程二 JNI 函数、数据类

Android NDK(JNI)详解教程二 JNI 函数、数据类

作者: Kael_Zhang的安卓笔记 | 来源:发表于2023-02-28 14:02 被阅读0次

    JNI 函数

    #include <jni.h>
    #include <string>
    
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_sample_projectname_MainActivity_stringFromJNI(
            JNIEnv* env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
    
    • 函数名 Java_com_sample_projectname_MainActivity_stringFromJNI,若是静态注册,则命名需要为固定格式,动态注册则不需要,以静态为例
      1.Java是函数的前缀
      2.com_sample_projectname_MainActivity是函数所在java类路径
      3.stringFromJNI是方法名
    • 函数返回值
      JNIEXPORT和JNICALL宏中间的jstring,表示函数的返回值类型,对应Java的String类型

    JNI 数据类型

    在调用JNI方法将实参传递给C/C++函数的时候,会自动将java形参的数据类型自动转换成C/C++相应的数据类型,所以我们在写JNI程序的时候,必须要明白它们之间数据类型的对应关系
    1.基本数据类型

    Java Type Native Type C/C++ Type Description
    boolean jboolean unsigned char unsigned 8 bits
    byte jbyte signed char signed 8 bits
    char jchar unsigned short unsigned 16 bits
    short jshort signed short signed 16 bits
    int jint signed int signed 32 bits
    long jlong signed long signed 64 bits
    float jfloat float 32 bits
    double jdouble double 64 bits

    2.引用类型

    Java Type Native type
    all object jobject
    java.lang.Class instances jstring
    arrays jarray
    Object[] jobjectArray
    boolean[] jbooleanArray
    byte[] jbyteArray
    char[] jcharArray
    int[] jintArray
    long[] jlongArray
    float[] jfloatAyyay
    double[] jdoubleArray
    java.lang.Throwable Objects jthrowable

    描述符

    • 类描述符
    1. 类描述符用来表示一个类或者接口的名字。
    2. 把类或者接口在java中所定义的完整名称中的"."替换成"/"就是类描述符,比如:java.lang.String的类描述符为 java/lang/string
      3.数组类的描述符:在"["后面跟着数组元素的类型的字段描述符,比如:"int[]"的类描述符为 "[I";"double[][][]"的类描述符为:"[[[D" ,一个 "[" 代表一维
    • 字段描述符
    Java Type Native type
    boolean Z
    byte B
    char C
    short S
    int I
    long J
    float F
    double D

    引用类型的字段描述符的第一个字符是"L",接着写类描述符,最后以";"结尾,L 和 ";" 必不可少!数组类型的字段描述符的定义规则和数组类描述符一致

    Java Type Native type
    String "Ljava/lang/String;"
    int[] "[I"
    Object[] "[Ljava/lang/Object;"
    • 方法描述符
      1.首先在"()"中描述参数类型
      2.然后在"()"后面描述返回类型
      3.参数类型的描述符之间不能有空格或者其他分隔符
      4."V"用来表示void
      5.构造函数使用"<init>"描述
    Java Type Native type
    String f(); "()Ljava/lang/String;"
    long f(int i, Class c); "(ILjava/lang/Class;)J"
    String(byte[] bytes); "([B)V"

    函数理解

    • 函数参数 (JNIEnv* env, jobject /* this /)
      1.参数 JNIEnv
      env:JNI 所有的接口函数都是通过这个指针调用的。
      2.参数 object:如果 Java 中此方法是实例方法,那么这边就是 Java 实例,如果是类方法,那么就是 Java 类
    • 调用GetStringUTFChars后必须需要调用ReleaseStringUTFChars

    相关文章

      网友评论

          本文标题:Android NDK(JNI)详解教程二 JNI 函数、数据类

          本文链接:https://www.haomeiwen.com/subject/khklldtx.html