JNI/NDK开发指南--访问数组

本文参考:https://blog.csdn.net/xyang81/article/details/42346165

直接上代码:

    void testFunc(){
        int[] indexs = new int[]{4, 5, 6}; 
        int[] ages = new int[]{3,4,5,6,7,8};
        int sum = sumArray(ages);
        Log.d(TAG, "sum="+sum);
        int sum2 = sumArray2(indexs);
        Log.d(TAG,"sum2="+sum2);

        int[][] arr = initInt2DArray(3);
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.format("arr[%d][%d] = %d\n", i, j, arr[i][j]);
            }
        }
    }

    public native int sumArray(int[] iarr);

    public native int sumArray2(int[] iarr);

    private native int[][] initInt2DArray(int size);

以下是c++代码片段


JNIEXPORT jint JNICALL Java_com_test_myjnitest_MainActivity_sumArray(
        JNIEnv *env, jobject jthis, jintArray jintArray1) {
    if (NULL == env || NULL == jthis || NULL == jintArray1) {
        return 0;
    }

    jint i, sum = 0;
    jint *c_arrays;
    jint array_length;
    //1. 获取数组长度
    array_length = env->GetArrayLength(jintArray1);
    //2. 根据数组长度和数组元素的数据类型申请存放java数组元素的缓冲区
    c_arrays = (jint *) malloc(sizeof(jint) * array_length);
    //3. 初始化缓冲区
    memset(c_arrays, 0, sizeof(jint) * array_length);
    //4. 拷贝Java数组中的所有元素到缓冲区中
    env->GetIntArrayRegion(jintArray1, 0, array_length, c_arrays);
    LOGD("########## array_length =%d", array_length);
    for (i = 0; i < array_length; i++) {
        sum += c_arrays[i]; //5. 累加数组元素的和
        LOGD("########## index =%d, arrays=%d,sum=%d", i, c_arrays[i], sum);
    }
    free(c_arrays); //6. 释放存储数组元素的缓冲区

    return sum;
}

JNIEXPORT jint JNICALL Java_com_test_myjnitest_MainActivity_sumArray2(
        JNIEnv *env, jobject jthis, jintArray jintArray1) {
    if (NULL == env || NULL == jthis || NULL == jintArray1) {
        return 0;
    }
    jint i, sum = 0;
    jint *c_array;
    jint array_length;

    // 可能数组中的元素在内存中是不连续的,JVM可能会复制所有原始数据到缓冲区,然后返回这个缓冲区的指针
    c_array = env->GetIntArrayElements(jintArray1, NULL);

    if (NULL == c_array) {
        return 0; // JVM复制原始数据到缓冲区失败
    }

    array_length = env->GetArrayLength(jintArray1);

    for (i = 0; i < array_length; ++i) {
        sum += c_array[i];
        LOGD("########## index =%d, arrays=%d,sum=%d", i, c_array[i], sum);
    }

    env->ReleaseIntArrayElements(jintArray1, c_array, 0); // 释放可能复制的缓冲区

    return sum;
}

JNIEXPORT jobjectArray JNICALL Java_com_test_myjnitest_MainActivity_initInt2DArray(
        JNIEnv *env, jobject jthis, jint size) {

    if (NULL == env || NULL == jthis) {
        return 0;
    }

    jobjectArray result;
    jclass clsIntArray;
    jint i,j;
    // 1.获得一个int型二维数组类的引用
    clsIntArray = env->FindClass("[I");
    if (clsIntArray == NULL) {
        return NULL;
    }
    // 2.创建一个数组对象(里面每个元素用clsIntArray表示)
    result = env->NewObjectArray(size,clsIntArray,NULL);
    if (result == NULL) {
        return NULL;
    }

    // 3.为数组元素赋值
    for (i = 0; i < size; ++i){
        jint buff[256];
        jintArray intArr = env->NewIntArray(size);
        if (intArr == NULL) {
            return NULL;
        }

        for (j = 0; j < size; j++) {
            buff[j] = i + j;
        }
        env->SetIntArrayRegion(intArr, 0,size,buff);
        env->SetObjectArrayElement(result, i, intArr);
        env->DeleteLocalRef(intArr);
    }

    return result;
}

本文源码:https://download.csdn.net/download/myjie0527/10670564

猜你喜欢

转载自blog.csdn.net/myjie0527/article/details/82730045