JNI操作数组代码

来源:互联网 发布:淘宝信用等级提升 编辑:程序博客网 时间:2024/05/09 12:59
JNI中处理数组通用对象为jobjectArray 当然常规的类型比如整形为jintArray,布尔型为jbooleanArray,但没有出现jstringArray这样的类型。处理数组时我们需要考虑数组的长度不能为0才能继续操作,不然就会有访问越界等问题,在JNI中提供了通用类型的GetArrayLength函数。我们从Java传入一个以整形数组,在JNI中将每个元素相加为例返回一个整形告诉Java运算的结果。
  JNIEXPORT jint JNICALL Java_Android123_CwjTest (JNIEnv *env, jobject obj, jintArray array)
  {
  int sum = 0;
  jsize length = (*env)->GetArrayLength(env, array);  //获取数组长度
  if(length==0)   //防止异常发生,如果是空的需要返回了
  return 0;
  jint *pointer = (*env)->GetIntArrayElements(env, array, 0); //获取数组指针
  for (int i=0; i<length; i++)
  {
  sum += pointer[i]; //相加每个数组元素
  }
  (*env)->ReleaseIntArrayElements(env, array, pointer, 0); //释放内存,这个不能忘了
  return sum;
  }
  如何在JNI中构造一个数组呢?  Android开发网给大家一个简单的示例,返回一个整形数组:
  JNIEXPORT jobjectArray JNICALL
  Java_Android123_CwjTest2(JNIEnv *env, jclass clazz)
  {
  jobjectArray result; //定义返回对象
  jclass intArrayClazz = (*env)->FindClass(env, "[I"); //查找整形数组
  if (intArrayClazz == NULL)
  {
  return NULL;
  }
  result = (*env)->NewObjectArray(env, size, intArrayClazz, NULL); //构造一个新的数组对象
  if (result == NULL)
  {
  return NULL;
  }
  for (int i = 0; i < 10 ; i++)  //循环10次
  {
  jint szBuffer[256];
  int j;
  jintArray newIntArray = (*env)->NewIntArray(env, 10); //构造10个整形数组
  if (newIntArray == NULL)
  {
  return NULL;
  }
  for (j = 0; j < 10 ; j++) //10个
  {
  szBuffer[j] = i + j;
  }
  (*env)->SetIntArrayRegion(env, newIntArray, 0, 10, szBuffer); //设置长度为10个
  (*env)->SetObjectArrayElement(env, result, i, newIntArray);
  (*env)->DeleteLocalRef(env, newIntArray);
  }
  return result;
  }
原创粉丝点击