在Java中數組分為兩種:
1.基本類型數組
java數組的使用、2.對象類型(Object[])的數組(數組中存放的是指向Java對象中的引用)
一個能通用于兩種不同類型數組的函數:
GetArrayLength(jarray array);
學完Java再學C語言?首先來看一下怎么處理基本類型的數組:
(1) GetArrayElements(Array arr , jboolean* isCopide);
這類函數可以把Java基本類型的數組轉換到C/C++中的數組,有兩種處理方式,一種是拷貝一份傳回本地代碼,另一個是把指向Java數組的指針直接傳回到本地代碼中,處理完本地化的數組后,通過ReleaseArrayElements來釋放數組
java數組初始化賦值、(2) ReleaseArrayElements(Array arr , * array , jint mode)
用這個函數可以選擇將如何處理Java跟C++的數組,是提交,還是撤銷等,內存釋放還是不釋放等
mode可以取下面的值:
國外java與C。0 :對Java的數組進行更新并釋放C/C++的數組
JNI_COMMIT :對Java的數組進行更新但是不釋放C/C++的數組
JNI_ABORT:對Java的數組不進行更新,釋放C/C++的數組
java object數組,(3) GetPrimittiveArrayCritical(jarray arr , jboolean* isCopied);
(4) ReleasePrimitiveArrayCritical(jarray arr , void* array , jint mode);
也是JDK1.2出來的,為了增加直接傳回指向Java數組的指針而加入的函數,同樣的也會有同GetStringCritical的死鎖的問題
(5) GetArrayRegion(Array arr , jsize start , jsize len , * buffer);
在C/C++預先開辟一段內存,然后把Java基本類型的數組拷貝到這段內存中,這個方法和之前拷貝字符串的GetStringRegion方法的原理是類似的
(6) SetArrayRegion(Array arr , jsize start , jsize len , const * buffer);
把Java基本類型的數組中的指定范圍的元素用C/C++的數組中的元素來賦值
(7) Array NewArray(jsize sz)
指定一個長度然后返回相應的Java基本類型的數組
在來看一下怎么處理對象型數組
JNI沒有提供直接把Java的對象類型數組(Object[])直接轉到C++中的Object[]數組的函數,而是直接通過Get/SetObjectArrayElement這樣的函數來對Java的Object[]數組進行操作由于去的對象數組沒有進行拷貝,所以不需要釋放任何資源
NewObjectArray可以通過指定長度跟初始值來創建某個類的數組
下面來看一下例子:操作兩種類型的數組
Java中的代碼:
7.jpg (26.45 KB, 下載次數: 13)
2016-11-24 17:48 上傳
C++中的代碼:
9.jpg (47.25 KB, 下載次數: 13)
2016-11-24 17:51 上傳
10.jpg (54.16 KB, 下載次數: 12)
2016-11-24 17:51 上傳
15.jpg (77.75 KB, 下載次數: 10)
2016-11-24 17:51 上傳
在Eclipse編譯運行結果如下:
16.jpg (20.51 KB, 下載次數: 9)
2016-11-24 17:52 上傳
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态