本文参考: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;
}