0

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

Input:c++中的jobject input,即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);

下一步我能做什么

4

1 回答 1

0
    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()检查。但是如果你不检查,如果数据不符合你的预期,就要做好崩溃的准备。

其他改进可能是在创建向量时将容量设置retKeyV为。lenArrayList_byte32

于 2018-12-29T22:53:03.023 回答