美文网首页
jni中java和c++二维数组和string数组的转换

jni中java和c++二维数组和string数组的转换

作者: zuolingfeng | 来源:发表于2015-08-06 22:04 被阅读3706次
    1. 二维数组和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; 
    }
    

    上面代码中的第三行,

    jobjectArray result;
    

    因为要返回值,所以需要新建一个jobjectArray对象。

    jclass intArrCls = env->FindClass("[I");
    

    是创建一个jclass的引用,因为 result的元素是一维int数组的引用,所以intArrCls必须是一维int数组的引用,这一点是如何保证的呢?注意FindClass的参数" [I",JNI就是通过它来确定引用的类型的,I表示是int类型,[标识是数组。对于其他的类型,都有相应的表示方法,
    Java代码:

    Z boolean
    B byte
    C char
    S short
    I int
    J long
    F float
    D double
    

    String是通过Ljava/lang/String表示的,那相应的,String数组就应该是[Ljava/lang/String;

    result = env->NewObjectArray(size, intArrCls, NULL);的作用是为result分配空间
    jintArray iarr = env->NewIntArray(size);是为一维int数组iarr分配空间。
    env->SetIntArrayRegion(iarr, 0, size, tmp);是为iarr赋值。
    env->SetObjectArrayElement(result, i, iarr);是为result的第i个元素赋值。

    相关文章

      网友评论

          本文标题:jni中java和c++二维数组和string数组的转换

          本文链接:https://www.haomeiwen.com/subject/qbkbqttx.html