天天看點

JNI之路徑初探---5

本篇文章講解JNI接收處理完從Java層傳遞的資料後記憶體的同步問題。

從JAVA層傳遞資料給C排序

數組排序及記憶體同步

qsort是一個C語言的排序函數,這不是我們讨論的重點,

jint * (JNICALL *GetIntArrayElements)

(JNIEnv *env, jintArray array, jboolean *isCopy);

這個函數的作用是得到一個jni數組元素的指針,jintarray裡面的每一個元素都是jint類型,數組的特性就是第一個元素的位址就是它的指針,根據元素類型就可以往下得到所有元素,這個函數的第三元素是一個jboolean類型的指針,它的含義就是說如果我現在在C語言層處理這個數組,它要不要複制,不複制代表處理的是和JAVA同一個記憶體即數組,這裡官方建議填NULL,那麼數組排序後,操作的也是同一塊記憶體為什麼還要去同步一下呢?這裡我列印了一下他們的位址,發現不同,由此可以得出NULL和JNI_TRUE都會複制記憶體,如果有興趣的同學可以試一下JNI_FALUSE,這個參數同樣還是複制了,而填入JNI_TURE後再同步記憶體會提示JVM運作時的異常,是以不管是哪一個參數其實都不是操作同一塊記憶體,最後如果要在JAVA層去處理結果一定要同步一下記憶體。