Как передать List из Java в JNI (C++) по сслыке?

118
13 января 2021, 18:30

у меня есть функция написаная на C++(JNI) которая получает как параметр jobject (это по сути мой List) и заполняет его данными.

Я могу вызвать эту функцию из Java передать ей List<Integer> и она действительно заполнит его(в моем случае семерками).

Но проблема в том, что функция создает свою область с памяти и заполняет ее... В итоге мой List остается не заполненым...

То, что мне нужно сделать это как то передать List из Java по сслыке... Чтоб код из JNI работал уже с тем, что я ему передал, а не создавал свое...

Вот такой код

С++

В MyClass метод

extern "C" JNIEXPORT void JNICALL
Java_com_google_ar_core_examples_java_helloar_HelloArActivity_fillList(
    JNIEnv *env,
    jobject /* this */,
    jobject input
) {
jclass alCls = env->FindClass("java/util/ArrayList");
if (alCls == nullptr ) {
    return;
}
jmethodID alGetId  = env->GetMethodID(alCls, "get", "(I)Ljava/lang/Object;");
jmethodID alSizeId = env->GetMethodID(alCls, "size", "()I");
if (alGetId == nullptr || alSizeId == nullptr) {
    env->DeleteLocalRef(alCls);
    return;
}
int pointCount = static_cast<int>(env->CallIntMethod(input, alSizeId));
if (pointCount < 1) {
    env->DeleteLocalRef(alCls);
    return;
}
std::vector<int> points;
points.reserve(pointCount);
for (int i = 0; i < pointCount; ++i) {
    points.push_back(7);
}
env->DeleteLocalRef(alCls);
}

Вот написано в Java

public native void fillList(List<Integer> input);
private void TEST_DELETE_IT()
{
    List<Integer> list = new ArrayList<Integer>()
    {
        {
            add(1);
            add(1);
            add(1);
            add(1);
        }
    };
    fillList(list);
    Log.e("TAG", "Here I expect to get my List full with 7");
}

Как передать List из Java в JNI по сслыке?

ПРАВКА

Может вообще следует передавать не List а array? Мне кажется это должно быть проще...

ПРАВКА

Добавил вызов метода get теперь функция выглядит вот так

extern "C" JNIEXPORT void JNICALL
Java_com_google_ar_core_examples_java_helloar_HelloArActivity_fillList(
    JNIEnv *env,
    jobject /* this */,
    jobject input
) {
jclass java_util_ArrayList = env->FindClass("java/util/ArrayList");
if (java_util_ArrayList == nullptr) {
    return;
}
jmethodID java_util_ArrayList_ = env->GetMethodID(java_util_ArrayList, "<init>", "(I)V");
jmethodID java_util_ArrayList_get = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
jmethodID java_util_ArrayList_add = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)Z");
jmethodID java_util_ArrayList_size = env->GetMethodID(java_util_ArrayList, "size", "()I");
if (java_util_ArrayList_add == nullptr || java_util_ArrayList_get == nullptr || java_util_ArrayList_size == nullptr) {
    env->DeleteLocalRef(java_util_ArrayList);
    return;
}
int pointCount = static_cast<int>(env->CallIntMethod(input, java_util_ArrayList_size));
if (pointCount < 1) {
    env->DeleteLocalRef(java_util_ArrayList);
    return;
}
for (int i = 0; i < pointCount; ++i) {
    env->CallBooleanMethod(input, java_util_ArrayList_add, 7);
}
env->DeleteLocalRef(java_util_ArrayList);

}

И действительно теперь это работает правильно - я передаю List с 4мя элементами, вызываю функцию которая добавляет мне в List еще 4 элемента. Но только проблема в том, что она добавляет не Integer, а какой то обьект типа DexCache , что это ?

READ ALSO
Помогите с побитовыми операциями

Помогите с побитовыми операциями

Вот пример из книги которую читаю и совершенно не понимаю вот этого (fs&1 > 0) и аналогичных далее выражений

141
Android не показывается DatePickerDialog в DialogFragment

Android не показывается DatePickerDialog в DialogFragment

Задача: реализовать фрагмент, который позволяет вернуть в место (во фрагмент), откуда этот фрагмент вызван, выбранную пользователем дату

126
Передача данных из RecyclerAdapter

Передача данных из RecyclerAdapter

хочу в этом куске кода

106