在创建新对象时,尝试将参数提供给JNI对象的构造函数时会出现错误
Getting error when trying to give parameters to constructor of JNI object while creating new object
我正在使用正在使用NDK,CPP,OPENCV和JAVA的Android应用程序。所以,我在这里遇到了错误。其中我需要使用JNI方法将Arrayof Mat对象从CPP传递到Java。我的代码如下。
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和RECT作为参数来为MAT类创建构造函数签名,因为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检测到的错误:使用无效的jobject 0xa32788f8
通过LS和LSRECT。
现在,当我将垫子传递并作为对象作为对象时,它甚至不会编译并给出以下说明的错误。
代码 ->
刚从
更改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.
请告诉我,如果您对此有任何了解,或者发现此 Tonge 。
您创建垫子对象的尝试将指针传递到两个C 对象,在那里它应该通过Java对象。有问题的说法是:
jobject matObject = (jobject)env->NewObject(matclass, constructor, ls, lsRect);
您不需要使用指示LS和LSRECT,您需要使用Env-> newObject创建另一个MAT jobight和rect jobject;然后将这些职位传递给您的原始呼叫。
您还需要设置垫子的字段并置入对象。为此,您必须为它们获得字段ID(请参阅此stackoverflow答案),并使用JNI功能,例如SetIntField,SetDoubleField等。
这很复杂,我建议您获得Sheng Liang的Java Native界面的副本,这对我很有帮助。
相关文章:
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- 如何调用传递给 JNI 'jobject' 的 Java 对象的子类/子类的方法
- 将对象传递给 Java C++与使用 JNI 逐个设置对象参数
- JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
- 如何将类对象传递给 jni 本机方法
- JNI返回Java对象,可以返回本地参考,还是必须是全局
- 将 JSON 对象作为参数在 JNI 中传递给 CPP,并在 CPP 中检索 JSON 对象的数据
- Android JNI:Java通过JNI调用C++类对象
- 在 JNI 中创建新对象
- 在创建新对象时,尝试将参数提供给JNI对象的构造函数时会出现错误
- 使用 JNI 从 Java 访问 C++ 对象数组
- JNI Java对象实例化期间的Segfault
- 通过其他线程通过JNI呼叫保存的Java对象
- 有没有人试图通过 JNI 将 protobuf 对象从 C++ 返回到 Java
- JNI:MAP jobject到本机C 对象
- JNI:正确管理Java对象的寿命
- JNI与共享对象有问题
- JNI:从C++调用JAVA方法,返回对象,引用和GC
- ReferenceTable溢出(jni-android),数组对象释放
- JNI/Android NDK-维护全局对象引用