Как конвертировать ArrayListк векторудля JNI? - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу конвертировать ArrayList в Java в вектор в C ++.Как я могу это сделать?

Input: jobject input в c ++, который является ArrayList в JAVA.Вывод: класс с именем vector в c ++;

// Найти 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);

Что я могу сделать дальше

1 Ответ

0 голосов
/ 30 декабря 2018
    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 при создании вектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...