//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出来,但是数组元素位置没有换到。
有没有人遇过这情况
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出来,但是数组元素位置没有换到。
有没有人遇过这情况
(*env)->ReleaseIntArrayElements(env,jarr,cint,0);
奇怪啊,莫非指针不是直接指向传过来的数组地址,而是指向一个副本?用的是ndk r12b,就算版本差异应该也不会差别得这么离谱的吧?有没有大神之前遇到过,解析下这其中的原因?
void (*ReleaseIntArrayElements)(JNIEnv*, jintArray, jint*, jint);
该函数与 GetIntArrayElements 函数可以说是对应的。
它完成的功能是释放资源和数据更新。
由于 Java 的垃圾收集具有可能改变内存中对象的位置,如不采取必要措施,
被访问的数组指针就可能不再指向正确的存区。因此,对于数组,要么把它“钉”在固定的存区,
要么把它拷贝至固定的存区,总之在访问它的期间要使数组元素总在原地。
作完操作之后,再调用这个函数,解除对它的固定。
另外,在调用这个函数之前,所有更新都没有作用在数组本身上。
第三个参数就是决定更新与否的。
取值 零(0) 时,更新数组并释放所有元素;
取值 JNI_COMMIT 时,更新但不释放所有元素;
取值 JNI_ABORT 时,不作更新但释放所有元素;