本文參考:https://blog.csdn.net/xyang81/article/details/42346165
直接上代碼:
void testFunc(){
int[] indexs = new int[]{4, 5, 6};
int[] ages = new int[]{3,4,5,6,7,8};
int sum = sumArray(ages);
Log.d(TAG, "sum="+sum);
int sum2 = sumArray2(indexs);
Log.d(TAG,"sum2="+sum2);
int[][] arr = initInt2DArray(3);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.format("arr[%d][%d] = %d\n", i, j, arr[i][j]);
}
}
}
public native int sumArray(int[] iarr);
public native int sumArray2(int[] iarr);
private native int[][] initInt2DArray(int size);
以下是c++代碼片段
JNIEXPORT jint JNICALL Java_com_test_myjnitest_MainActivity_sumArray(
JNIEnv *env, jobject jthis, jintArray jintArray1) {
if (NULL == env || NULL == jthis || NULL == jintArray1) {
return 0;
}
jint i, sum = 0;
jint *c_arrays;
jint array_length;
//1. 獲取數組長度
array_length = env->GetArrayLength(jintArray1);
//2. 根據數組長度和數組元素的數據類型申請存放java數組元素的緩衝區
c_arrays = (jint *) malloc(sizeof(jint) * array_length);
//3. 初始化緩衝區
memset(c_arrays, 0, sizeof(jint) * array_length);
//4. 拷貝Java數組中的所有元素到緩衝區中
env->GetIntArrayRegion(jintArray1, 0, array_length, c_arrays);
LOGD("########## array_length =%d", array_length);
for (i = 0; i < array_length; i++) {
sum += c_arrays[i]; //5. 累加數組元素的和
LOGD("########## index =%d, arrays=%d,sum=%d", i, c_arrays[i], sum);
}
free(c_arrays); //6. 釋放存儲數組元素的緩衝區
return sum;
}
JNIEXPORT jint JNICALL Java_com_test_myjnitest_MainActivity_sumArray2(
JNIEnv *env, jobject jthis, jintArray jintArray1) {
if (NULL == env || NULL == jthis || NULL == jintArray1) {
return 0;
}
jint i, sum = 0;
jint *c_array;
jint array_length;
// 可能數組中的元素在內存中是不連續的,JVM可能會複製所有原始數據到緩衝區,然後返回這個緩衝區的指針
c_array = env->GetIntArrayElements(jintArray1, NULL);
if (NULL == c_array) {
return 0; // JVM複製原始數據到緩衝區失敗
}
array_length = env->GetArrayLength(jintArray1);
for (i = 0; i < array_length; ++i) {
sum += c_array[i];
LOGD("########## index =%d, arrays=%d,sum=%d", i, c_array[i], sum);
}
env->ReleaseIntArrayElements(jintArray1, c_array, 0); // 釋放可能複製的緩衝區
return sum;
}
JNIEXPORT jobjectArray JNICALL Java_com_test_myjnitest_MainActivity_initInt2DArray(
JNIEnv *env, jobject jthis, jint size) {
if (NULL == env || NULL == jthis) {
return 0;
}
jobjectArray result;
jclass clsIntArray;
jint i,j;
// 1.獲得一個int型二維數組類的引用
clsIntArray = env->FindClass("[I");
if (clsIntArray == NULL) {
return NULL;
}
// 2.創建一個數組對象(裏面每個元素用clsIntArray表示)
result = env->NewObjectArray(size,clsIntArray,NULL);
if (result == NULL) {
return NULL;
}
// 3.爲數組元素賦值
for (i = 0; i < size; ++i){
jint buff[256];
jintArray intArr = env->NewIntArray(size);
if (intArr == NULL) {
return NULL;
}
for (j = 0; j < size; j++) {
buff[j] = i + j;
}
env->SetIntArrayRegion(intArr, 0,size,buff);
env->SetObjectArrayElement(result, i, intArr);
env->DeleteLocalRef(intArr);
}
return result;
}