3. 数组类型的传递
和String一样,JNI为Java基本类型的数组提供了j*Array类型,比如int[]对应的就是jintArray。来看一个传递int数组的例子,
Java代码:
- JNIEXPORT jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr){
- jint *carr;
- carr = env->GetIntArrayElements(arr, false);
- if(carr == NULL) {
- return 0;
- }
- jint sum = 0;
- for(int i=0; i<10; i++) {
- sum += carr[i];
- }
- env->ReleaseIntArrayElements(arr, carr, 0);
- return sum;
- }
这个例子中的GetIntArrayElements和ReleaseIntArrayElements函数就是JNI提供用于处理int数组的函数。如果试图用arr的方式去访问jintArray类型,毫无疑问会出错。JNI还提供了另一对函数GetIntArrayRegion和 ReleaseIntArrayRegion访问int数组,就不介绍了,对于其他基本类型的数组,方法类似。
4. 二维数组和String数组
在JNI中,二维数组和String数组都被视为object数组,因为数组和String被视为object。仍然用一个例子来说明,这次是一个二维int数组,作为返回值。
Java代码:
- JNIEXPORT jobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclass cls, int size){
- jobjectArray result;
- jclass intArrCls = env->FindClass("[I");
- result = env->NewObjectArray(size, intArrCls, NULL);
- for (int i = 0; i < size; i++) {
- jint tmp[256];
- jintArray iarr = env->NewIntArray(size);
- for(int j = 0; j < size; j++) {
- tmp[j] = i + j;
- }
- env->SetIntArrayRegion(iarr, 0, size, tmp);
- env->SetObjectArrayElement(result, i, iarr);
- env->DeleteLocalRef(iarr);
- }
- return result;
- }
系列之Android 深入研究JNI(九)的帖子链接http://www.eoeandroid.com/thread-90138-1-1.html