//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出來,但是陣列元素位置沒有換到。
有沒有人遇過這情況。。。
uj5u.com熱心網友回復:
在最后加上這句就正常了。(*env)->ReleaseIntArrayElements(env,jarr,cint,0);
奇怪啊,莫非指標不是直接指向傳過來的陣列地址,而是指向一個副本?
用的是ndk r12b,就算版本差異應該也不會差別得這么離譜的吧?
有沒有大神之前遇到過,決議下這其中的原因?
uj5u.com熱心網友回復:
謝謝樓主分享 我最后加了 env->ReleaseIntArrayElements(ja,p,0);uj5u.com熱心網友回復:
如下為 ReleaseIntArrayElements 函式的原型void (*ReleaseIntArrayElements)(JNIEnv*, jintArray, jint*, jint);
該函式與 GetIntArrayElements 函式可以說是對應的。
它完成的功能是釋放資源和資料更新。
由于 Java 的垃圾收集具有可能改變記憶體中物件的位置,如不采取必要措施,
被訪問的陣列指標就可能不再指向正確的存區。因此,對于陣列,要么把它“釘”在固定的存區,
要么把它拷貝至固定的存區,總之在訪問它的期間要使陣列元素總在原地。
作完操作之后,再呼叫這個函式,解除對它的固定。
另外,在呼叫這個函式之前,所有更新都沒有作用在陣列本身上。
第三個引數就是決定更新與否的。
取值 零(0) 時,更新陣列并釋放所有元素;
取值 JNI_COMMIT 時,更新但不釋放所有元素;
取值 JNI_ABORT 時,不作更新但釋放所有元素;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/104130.html
標籤:Android
下一篇:求購安卓,虛擬視頻軟體,插件。
