繁体   English   中英

如何转换ArrayList <byte[]> 矢量 <char[]> 对于JNI?

[英]How to convert ArrayList<byte[]> to vector<char[]> for JNI?

我想将java中的ArrayList转换为c ++中的向量。 我怎样才能做到这一点?

输入:c ++中的jobject输入,它是JAVA中的ArrayList。 输出:c ++中名为vector的类;

//找到jclass 4 ArrayList,只测试jposCommits和jnegCommits是ArrayList的实例

jclass cls_arraylist = env->FindClass("java/util/ArrayList");

//get element
jmethodID arraylist_get = env->GetMethodID(cls_arraylist, "get", "(I)Ljava/lang/Object;");
//get array size
jmethodID arraylist_size = env->GetMethodID(cls_arraylist,"size","()I");
//get the length of pos and neg commits
jint lenArrayList_byte32 = env->CallIntMethod(jobArrayList_byte32, arraylist_size);


vector<byte[]> retKeyV;

for (int i = 0; i < lenArrayList_byte32; ++i) {

    jobject joneKey = env->CallObjectMethod(jobArrayList_byte32, arraylist_get, i);

我接下来该怎么办

    jbytearray joneKey = static_cast<jbytearray>(env->CallObjectMethod(jobArrayList_byte32, arraylist_get, i));
    // to be protected, check that the type matches your expectation
    jclass joneKey_class = env->GetObjectClass(joneKey);
    jclass byteArray_class = env->FindClass("[B");
    assert(env->IsInstanceOf(joneKey_class, byteArray_class));
    jlong joneKey_len = env->GetArrayLength(joneKey);
    assert(joneKey_len > 0);
    byte* coneKey = new byte[joneKey_len];
    retKeyV.append(coneKey);
    env->GetByteArrayRegion(joneKey, 0, joneKey_len, coneKey);
    env->DeleteLocalRef(byteArray_class); // see comment below
    env->DeleteLocalRef(joneKey_class);
    env->DeleteLocalRef(joneKey);
}

为了减少一些不必要的开销,您可以保留对byteArray_class的全局引用,而不必每次都重复FindClass() 如果您不确定输入数据是否正确,则可以跳过所有IsInstance()检查。 但是,如果您不检查数据,请准备崩溃,如果数据不符合您的预期。

创建矢量时,可以retKeyVlenArrayList_byte32容量设置为retKeyV

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM