• Java: JNI对数组赋值并返回给Java


    在JNI中对java层的数组赋值有两种方式:一是在java层创建好数组,然后传递到JNI层,由JNI层进行赋值;二是直接在JNI层创建好数组并赋值,然后返回数组到Java层。下面是两种方式的对比实现:

    创建两个native方法

        //传递数组,操作后,返回
        public native void passArrayMethod(int[] arr);
    
        //创建指定长度数组
        public native int[] createArrayMethod(int len);

    生成对应的C函数

    JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod
      (JNIEnv *, jobject, jintArray);
    
    JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod
      (JNIEnv *, jobject, jint);

    传递数组给JNI,修改第一个元素值,然后排序

    int com(const void *a, const void *b){
        return *(int *)a - *(int *)b;//升序
    }
    JNIEXPORT void JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_passArrayMethod
            (JNIEnv *env, jobject jobj, jintArray jarr){
        //1.获取数组指针
        jint *arr = env->GetIntArrayElements(jarr, NULL);
        *arr = 100;
        //2.获取数组长度
        int len = env->GetArrayLength(jarr);
        //3.排序
        qsort(arr, len, sizeof(jint), com);
    
        //4.释放资源
        env->ReleaseIntArrayElements(jarr, arr, JNI_COMMIT);
    //    env->ReleaseIntArrayElements(jarr, arr, JNI_ABORT);
        //  对于最后一个参数(如果指针指向的数组为副本时,否则该参数不起作用)
        //      0       copy back the content and free the elems buffer
        //      JNI_COMMIT      copy back the content but do not free the elems buffer
        //      JNI_ABORT       free the buffer without copying back the possible changes
    };

    JNI生成数组,并返回

    JNIEXPORT jintArray JNICALL Java_com_test_git_jnidemo_JniUtil_JniDemo_createArrayMethod
            (JNIEnv *env, jobject jobj, jint len){
        //1.新建长度len数组
        jintArray jarr = env->NewIntArray(len);
        //2.获取数组指针
        jint *arr = env->GetIntArrayElements(jarr, NULL);
        //3.赋值
        int i = 0;
        for(; i < len; i++){
            arr[i] = i;
        }
        //4.释放资源
        env->ReleaseIntArrayElements(jarr, arr, 0);
        //5.返回数组
        return jarr;
    };

    MainActivity中调用

            int[] arr = {1, 3, 2, 6, 8, 0};
            Log.i(TAG, "arr修改前: " + getArrayString(arr));
            jd.passArrayMethod(arr);
            Log.i(TAG, "arr修改后: " + getArrayString(arr));
    
            Log.i(TAG, "------------------------------------------");
    
            int[] arr_new = jd.createArrayMethod(10);
            Log.i(TAG, "arr_new: "+ getArrayString(arr_new) );

    输出结果:

    09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr修改前: ,1,3,2,6,8,0
    09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr修改后: ,0,2,3,6,8,100
    09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: ------------------------------------------
    09-26 17:02:29.454 994-994/com.test.git.jnidemo I/MainActivity-: arr_new: ,0,1,2,3,4,5,6,7,8,9

    参考链接:

    1. JNI对数组赋值排序,创建数组并返回给Java

  • 相关阅读:
    python并发编程之深入理解yield from
    python中的多进程编程
    Python并发concurrent、Future类、异步
    【Socket通信】关于Socket通信原理解析及python实现
    深入理解Python元类
    Django RestFrameWork 源码解析
    Django的Restful规范
    小程序colorUI框架初步使用教程
    类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 (KeyMouseGo)
    如何在postgresql中,一句sql完成未有数据记录的insert,再update的操作
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/14023406.html
Copyright © 2020-2023  润新知