美文网首页
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