美文网首页Android-NDK/JNIJNI&NDK随笔-生活工作点滴
JNI&NDK开发最佳实践(四):JNI数据类型及与Ja

JNI&NDK开发最佳实践(四):JNI数据类型及与Ja

作者: taoyyyy | 来源:发表于2019-07-06 19:50 被阅读8次

    前言

    我们在.c或.cpp中实现本地方法时,我们不仅要关注方法之间的对应关系(即静态注册于动态注册),也要关注方法入参中数据类型的对应关系。

    举个例子,在java文件中声明本地方法如下

    public static native void test(short s, int i, long l, float f, double d, char c,
    boolean z, byte b, String str, Object obj, MyClass p, int[] arr);

    其在c中的对应实现如下

    JNIEXPORT void JNICALL Java_com_study_jnilearn_HelloWorld_test
    (JNIEnv *env, jclass cls, jshort s, jint i, jlong l, jfloat f,
    jdouble d, jchar c, jboolean z, jbyte b, jstring j_str, jobject jobj1, jobject job2, jintArray j_int_arr)
    {
    ...
    }

    可以发现,int变成了jint,int[]变成了jintArray。

    基本数据类型的对应

    基本数据类型对应.png

    引用数据类型的对应

    引用数据类型对应.png

    jvalue类型

    jvalue是一个unio(联合)类型,在C语中为了节约内存,会用联合类型变量来存储声明在联合体中的任意类型数据 。在JNI中将基本数据类型与引用类型定义在一个联合类型中,表示用jvalue定义的变量,可以存储任意JNI类型的数据,后面会介绍jvalue在JNI编程当中的应用。原型如下

    typedef union jvalue {
        jboolean z;
        jbyte    b;
        jchar    c;
        jshort   s;
        jint     i;
        jlong    j;
        jfloat   f;
        jdouble  d;
        jobject  l;
    } jvalue;
    
    

    更多JNI&NDK系列文章,参见:
    JNI&NDK开发最佳实践(一):开篇
    JNI&NDK开发最佳实践(二):CMake实现调用已有C/C++文件中的本地方法
    JNI&NDK开发最佳实践(三):CMake实现调用已有so库中的本地方法
    JNI&NDK开发最佳实践(四):JNI数据类型及与Java数据类型的映射关系
    JNI&NDK开发最佳实践(五):本地方法的静态注册与动态注册
    JNI&NDK开发最佳实践(六):JNI实现本地方法时的数据类型转换
    JNI&NDK开发最佳实践(七):JNI之本地方法与java互调
    JNI&NDK开发最佳实践(八):JNI局部引用、全局引用和弱全局引用
    JNI&NDK开发最佳实践(九):调试篇

    相关文章

      网友评论

        本文标题:JNI&NDK开发最佳实践(四):JNI数据类型及与Ja

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