gpt4 book ai didi

java - 在创建新对象时尝试向 JNI 对象的构造函数提供参数时出错

转载 作者:行者123 更新时间:2023-11-28 04:22:59 26 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,我在其中使用 NDK、CPP、Opencv 和 java。所以,在这里我收到错误。其中我需要使用 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 vector 。

获取类似 JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 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.

如果您对此有任何想法或发现任何错误,请告诉我谢谢

最佳答案

您尝试创建 Mat 对象会将指针传递给两个 C++ 对象,而它应该传递 Java 对象。有问题的陈述是:

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

您需要使用 env->NewObject 创建另一个 Mat jobject 和一个 Rect jobject,而不是传递指针 ls 和 lsRect;然后将这些 jobjects 传递给您对 NewObject 的原始调用。

您还需要设置 Mat 和 Rect 对象的字段。为此,您必须为它们获取字段 ID(请参阅 this StackOverflow 回答)并使用 JNI 函数,如 SetIntField、SetDoubleField 等。

比较复杂,推荐看一下盛亮的《The Java Native Interface》,对我很有帮助。

关于java - 在创建新对象时尝试向 JNI 对象的构造函数提供参数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55025236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com