Получение ошибки при попытке передать параметры конструктору объекта JNI при создании нового объекта

Я работаю над приложением для Android, в котором использую NDK, CPP, Opencv и java. Итак, здесь я получаю ошибку. В котором мне нужно передать объекты ArrayOf Mat из CPP в java, используя метод JNI. Мой код выглядит следующим образом.

jclass thisclass = env->GetObjectClass(instance);
jclass matclass = env->FindClass("org/opencv/core/Mat");
if (env->ExceptionOccurred())
    return NULL;

const char* constructorSignature = "(Lorg/opencv/core/Mat;Lorg/opencv/core/Rect;)V";
jmethodID constructor = env->GetMethodID(matclass, "<init>", constructorSignature);
if (env->ExceptionOccurred())
        return NULL;

Как показано выше, я получил класс Mat, а затем создал подпись конструктора для класса Mat, предоставив Mat и Rect в качестве аргумента, поскольку в классе Mat есть конструктор, который принимает Mat и Rect в качестве входных данных и создает Mat взамен.

Но после создания конструктора, когда я пытаюсь создать объект с помощью этого конструктора, я получаю сообщение об ошибке.

std::vector<Mat> selectedMats;
std::vector<Rect> selectedRects;
for(int h = 0; h < selectedRects.size(); h++){


        ls = &(selectedMats[h]);
        lsRect = &multiRectToCropOriginal;
        __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%ld", (long)ls);
        // create new object
        jobject matObject = (jobject)env->NewObject(matclass, constructor, ls, lsRect);

        // put object into array
        env->SetObjectArrayElement(matArray , h, matObject);


    }

selectedMats — это вектор Mat, который я создал и которому присвоил данные.

Получение ошибки, похожей на JNI, ОБНАРУЖЕНА ОШИБКА В ПРИЛОЖЕНИИ: использование недопустимого задания 0xa32788f8

при передаче ls и lsRect.

теперь, когда я передаю Mat и Rect как объект, он даже не компилируется и выдает ошибку, как указано ниже.

код ->

Только что изменился с

jobject matObject = (jobject)env->NewObject(matclass, constructor, *ls, *lsRect);

Build command failed.
Error while executing process /home/karshsoni/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /home/karshsoni/Documents/CVTextDetection/app/.externalNativeBuild/cmake/debug/armeabi-v7a --target native-lib}
[1/2] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o
FAILED: /home/karshsoni/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++  --target=armv7-none-linux-androideabi21 --gcc-toolchain=/home/karshsoni/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/karshsoni/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot  -Dnative_lib_EXPORTS -I/home/karshsoni/Downloads/OpenCV/opencv-4.0.1-android-sdk/OpenCV-android-sdk/sdk/native/jni/include -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mfpu=vfpv3-d16 -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++  -std=gnu++11 -O0 -fno-limit-debug-info  -fPIC   -std=gnu++11 -MD -MT CMakeFiles/native-lib.dir/native-lib.cpp.o -MF CMakeFiles/native-lib.dir/native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /home/karshsoni/Documents/CVTextDetection/app/src/main/cpp/native-lib.cpp
/home/karshsoni/Documents/CVTextDetection/app/src/main/cpp/native-lib.cpp:268:76: error: cannot pass object of non-trivial type 'cv::Mat' through variadic method; call will abort at runtime [-Wnon-pod-varargs]
        jobject matObject = (jobject)env->NewObject(matclass, constructor, ls, lsRect);
                                                                           ^
/home/karshsoni/Documents/CVTextDetection/app/src/main/cpp/native-lib.cpp:268:81: error: cannot pass object of non-trivial type 'cv::Rect' (aka 'Rect_<int>') through variadic method; call will abort at runtime [-Wnon-pod-varargs]
        jobject matObject = (jobject)env->NewObject(matclass, constructor, ls, lsRect);
                                                                                ^
2 errors generated.
ninja: build stopped: subcommand failed.

Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи по этому поводу или если вы обнаружили какую-либо ошибку в этом Спасибо.

Вам нужна пара jobject, которые ссылаются на экземпляры классов Джаваorg.opencv.core.Mat и org.opencv.core.Rect. То, что у вас есть сейчас, выглядит как экземпляры классов С++cv::Mat и cv::Rect.

Michael 06.03.2019 15:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
418
1

Ответы 1

Ваша попытка создать объект Mat передает указатели на два объекта C++, куда он должен передавать объекты Java. Заявление, о котором идет речь, таково:

jobject matObject = (jobject)env->NewObject(matclass, constructor, ls, lsRect);

Вместо передачи указателей ls и lsRect вам нужно использовать env->NewObject для создания другого проекта Mat и проекта Rect; затем передайте эти задания исходному вызову NewObject.

Вам также необходимо установить поля вашего объекта Mat и Rect. Для этого вам нужно будет получить для них идентификаторы полей (см. ответ это StackOverflow) и использовать функции JNI, такие как SetIntField, SetDoubleField и т. д.

Это довольно сложно, и я бы порекомендовал получить копию The Java Native Interface от Sheng Liang, которая мне очень помогла.

Спасибо за Ваш ответ. Я смогу создать новый объект для Mat и Rect, но как насчет данных, которые у меня уже есть, ls и lsRect. Как я могу скопировать эти данные из ls и lsRect в эквивалентный NewObject, созданный jObject в JNI? Пожалуйста, дайте мне знать, если вы знаете ответ?

J_Ghodasara 07.03.2019 06:04

Я добавил несколько кратких заметок по этому поводу. Хотелось бы, чтобы у меня было время добавить больше деталей, но я также рекомендовал книгу, в которой все это объясняется.

Graham Asher 11.03.2019 17:38

Другие вопросы по теме