//JNI
public native int arrays(int[] arr);//C文件里面的方法
JNIEXPORT jint JNICALL Java_com_example_du_1dezheng_ndk_MainActivity_arrays
  (JNIEnv *env, jobject obj, jintArray jarr){    jsize len= (*env)->GetArrayLength(env, jarr);
    jint * cint = (*env)->GetIntArrayElements(env, jarr, NULL);
    int i = 0;
    int j = 0;
    int temp = 0;    for(i = 0;i < len - 1;i++){
        for(j = 0;j < len - i - 1;j++){
            if(cint[j] > cint[j + 1]){
                temp = cint[j];
                cint[j] = cint[j + 1];
                cint[j + 1] = temp;
            }        }
    return 0;
    }
int[]  arr = new int[]{3,1,7,0,1,7,2,6};
int n = arrays(arr);最后可以正常返回0, 但是把数组打印出来,却没有排序到,还是原来的顺序。
理论指针指向的是原数组地址,把return放 for里面 也能re出来,但是数组元素位置没有换到。
有没有人遇过这情况

解决方案 »

  1.   

    在最后加上这句就正常了。
    (*env)->ReleaseIntArrayElements(env,jarr,cint,0);
    奇怪啊,莫非指针不是直接指向传过来的数组地址,而是指向一个副本?用的是ndk r12b,就算版本差异应该也不会差别得这么离谱的吧?有没有大神之前遇到过,解析下这其中的原因?
      

  2.   

    谢谢楼主分享  我最后加了 env->ReleaseIntArrayElements(ja,p,0);
      

  3.   

    如下为 ReleaseIntArrayElements 函数的原型 
        void (*ReleaseIntArrayElements)(JNIEnv*, jintArray, jint*, jint); 
          该函数与 GetIntArrayElements 函数可以说是对应的。
           它完成的功能是释放资源和数据更新。
           由于 Java 的垃圾收集具有可能改变内存中对象的位置,如不采取必要措施,
           被访问的数组指针就可能不再指向正确的存区。因此,对于数组,要么把它“钉”在固定的存区,
           要么把它拷贝至固定的存区,总之在访问它的期间要使数组元素总在原地。
           作完操作之后,再调用这个函数,解除对它的固定。
           另外,在调用这个函数之前,所有更新都没有作用在数组本身上。
           第三个参数就是决定更新与否的。
           取值 零(0) 时,更新数组并释放所有元素;
           取值 JNI_COMMIT 时,更新但不释放所有元素;
           取值 JNI_ABORT 时,不作更新但释放所有元素;