у меня есть функция написаная на 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
, что это ?
Вот пример из книги которую читаю и совершенно не понимаю вот этого (fs&1 > 0) и аналогичных далее выражений
Задача: реализовать фрагмент, который позволяет вернуть в место (во фрагмент), откуда этот фрагмент вызван, выбранную пользователем дату