本篇文章講解JNI接收處理完從Java層傳遞的數(shù)據(jù)后內(nèi)存的同步問題论笔。
從JAVA層傳遞數(shù)據(jù)給C排序
數(shù)組排序及內(nèi)存同步
qsort是一個C語言的排序函數(shù),這不是我們討論的重點千所,
jint * (JNICALL *GetIntArrayElements)
(JNIEnv *env, jintArray array, jboolean *isCopy);
這個函數(shù)的作用是得到一個jni數(shù)組元素的指針狂魔,jintarray里面的每一個元素都是jint類型,數(shù)組的特性就是第一個元素的地址就是它的指針淫痰,根據(jù)元素類型就可以往下得到所有元素最楷,這個函數(shù)的第三元素是一個jboolean類型的指針,它的含義就是說如果我現(xiàn)在在C語言層處理這個數(shù)組待错,它要不要復(fù)制籽孙,不復(fù)制代表處理的是和JAVA同一個內(nèi)存即數(shù)組,這里官方建議填NULL火俄,那么數(shù)組排序后犯建,操作的也是同一塊內(nèi)存為什么還要去同步一下呢?這里我打印了一下他們的地址瓜客,發(fā)現(xiàn)不同适瓦,由此可以得出NULL和JNI_TRUE都會復(fù)制內(nèi)存,如果有興趣的同學(xué)可以試一下JNI_FALUSE忆家,這個參數(shù)同樣還是復(fù)制了犹菇,而填入JNI_TURE后再同步內(nèi)存會提示JVM運行時的異常,所以不管是哪一個參數(shù)其實都不是操作同一塊內(nèi)存芽卿,最后如果要在JAVA層去處理結(jié)果一定要同步一下內(nèi)存。