Я хочу конвертировать ArrayList в Java для вектора в C ++. Как я могу это сделать?
Ввод: ввод задания в 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);
Что я могу сделать дальше
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
когда вектор создан.
Других решений пока нет …