NDK/JNI 中Java和C/C++互相傳遞數組
版權聲明:本文為CSDN博主「lza qq_895860866」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ezconn/article/details/101321564
Java 和 C/C++通過Jni這個中間件,可以實現相互之間的數組傳遞;我這里提供幾種方式;供參考;
第一種:Java通過JNI傳遞給C/C++,經過處理后,再復制到Java數組並返回;
Java的本地方法定義:
public native int[] arrEncode(int[] arr);
C代碼的實現:
#include <jni.h>
JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode
(JNIEnv *env, jobject obj, jintArray javaArr){
//獲取Java數組長度
int lenght = (*env)->GetArrayLength(env,javaArr);
//根據Java數組創建C數組,也就是把Java數組轉換成C數組
// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);
//把數組元素值加10處理
int i;
for(i =0 ; i<lenght;i++){
*(arrp+i) +=10;
}
//將C數組種的元素拷貝到Java數組中
(*env)->SetIntArrayRegion(env,javaArr,0,lenght,arrp);
return javaArr;
}
第二種方式:在C中直接操作元素,然后把C數組復制到Java數組中,並更新Java數組;
Java聲明的本地方法
public native void arrEncode(int[] arr);
C代碼實現
#include <jni.h>
JNIEXPORT void JNICALL Java_com_example_arrtoc_MainActivity_arrEncode
(JNIEnv *env, jobject obj, jintArray javaArr){
//獲取Java數組長度
int lenght = (*env)->GetArrayLength(env,javaArr);
//根據Java數組創建C數組,也就是把Java數組轉換成C數組
// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);
//把數組元素值加10處理
int i;
for(i =0 ; i<lenght;i++){
*(arrp+i) +=10;
}
//將C數組種的元素拷貝到Java數組中
(*env)->SetIntArrayRegion(env,javaArr,0,lenght,arrp);
}
第三種:在C代碼中新建Java數組,然后把C中數組的元素復制到Java數組中在返回給Java;
Java定義的本地方法:
public native int[] arrEncode(int[] arr);
C代碼實現:
#include <jni.h>
JNIEXPORT jintArray JNICALL Java_com_example_arrtoc_MainActivity_arrEncode
(JNIEnv *env, jobject obj, jintArray javaArr){
//獲取Java數組長度
int lenght = (*env)->GetArrayLength(env,javaArr);
//根據Java數組創建C數組,也就是把Java數組轉換成C數組
// jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
int* arrp =(*env)->GetIntArrayElements(env,javaArr,0);
//新建一個Java數組
jintArray newArr = (*env)->NewIntArray(env,lenght);
//把數組元素值加10處理
int i;
for(i =0 ; i<lenght;i++){
*(arrp+i) +=10;
}
//將C數組種的元素拷貝到Java數組中
(*env)->SetIntArrayRegion(env,newArr,0,lenght,arrp);
return newArr;
}
第四種:通過JNI種的ReleaseArrayElements方法實現:
這個方法的最后一個參數是模式:
0:Java數組進行更新,並且釋放C/C++數組。
JNI_ABORT: Java數組不進行更新,但是釋放C/C++數組。
JNI_COMMIT: Java數組進行更新,不釋放C/C++數組(函數執行完,數組還是會釋放)。
————————————————
版權聲明:本文為CSDN博主「lza qq_895860866」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ezconn/article/details/101321564