无法从本机C+;返回打开的CV mat+;在Android中使用Java

无法从本机C+;返回打开的CV mat+;在Android中使用Java,java,android,c++,opencv,java-native-interface,Java,Android,C++,Opencv,Java Native Interface,我正在开发一个Android应用程序,需要做一些图像处理。我通过java调用JNI来C++代码。我正在使用OpenCV进行图像处理。首先,我承认我刚刚开始使用OpenCv并学习图像处理。我现在所做的是尝试将开放的CV Mat数据从原生C++返回到java。 我不是C++开发人员。我正在关注这个链接- 这是我的本地C++代码< /p> #include <jni.h> #include <string> #include <opencv2/core/core.hpp

我正在开发一个Android应用程序,需要做一些图像处理。我通过java调用JNI来C++代码。我正在使用OpenCV进行图像处理。首先,我承认我刚刚开始使用OpenCv并学习图像处理。我现在所做的是尝试将开放的CV Mat数据从原生C++返回到java。 <>我不是C++开发人员。我正在关注这个链接-

这是我的本地C++代码< /p>

#include <jni.h>
#include <string>

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>

using namespace std;
using namespace cv;

extern "C"
JNIEXPORT jstring



JNICALL
Java_media_memento_memento_SphereCameraActivity_stitchPhotos(
        JNIEnv *env,
        jobject /* this */, jlong addrMat, jlong addrNewMat) {




    Mat& mat = *(Mat*)addrMat;
    Mat& newMat = *(Mat*)addrNewMat;

    newMat.create(mat.rows, mat.rows, mat.type());
    memcpy(newMat.data, mat.data , mat.step * mat.rows);

    std::string hello = "Stitching the photo in C++";
    return env->NewStringUTF(hello.c_str());
}
根据我的代码,当我从Java调用本机函数时,Java中的newMat变量应该得到另一个mat变量值。对吗?但是当我运行代码时,我的应用程序崩溃了。 它给了我这个错误

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: media.memento.memento, PID: 4823
                  java.lang.UnsupportedOperationException: Provided data element number (39397) should be multiple of the Mat channels count (3)
                      at org.opencv.core.Mat.put(Mat.java:1011)
                      at media.memento.memento.SphereCameraActivity$MyCameraListener$1.onBitmapReady(SphereCameraActivity.java:276)
                      at com.otaliastudios.cameraview.CameraUtils$1$1.run(CameraUtils.java:95)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

我的代码有什么问题,如何修复它?

Java调用堆栈在
stitchPhotos()
调用发生之前指向这一行:

mat.put(0,0,jpeg)

根据错误消息,
jpeg
的尺寸错误。似乎
put()
希望接收一个大小为3倍的数组(因为
mat
被声明为type
CV_8UC3
,它是8位的,无符号,每像素有3个通道)

< C++ >将一个代码> Mat <代码>复制到C++中的另一个更简单的方法是<代码> Copyto< /C> >或赋值运算符。示例:

Mat& mat = *(Mat*)addrMat;
Mat& newMat = *(Mat*)addrNewMat;
mat.copyTo(newMat);
newMat = mat;

Java调用堆栈在调用
stitchPhotos()
之前指向这一行:

mat.put(0,0,jpeg)

根据错误消息,
jpeg
的尺寸错误。似乎
put()
希望接收一个大小为3倍的数组(因为
mat
被声明为type
CV_8UC3
,它是8位的,无符号,每像素有3个通道)

< C++ >将一个代码> Mat <代码>复制到C++中的另一个更简单的方法是<代码> Copyto< /C> >或赋值运算符。示例:

Mat& mat = *(Mat*)addrMat;
Mat& newMat = *(Mat*)addrNewMat;
mat.copyTo(newMat);
newMat = mat;

我相信
newMat.create(mat.rows,mat.rows,mat.type())应该是
mat.rows,mat.cols
,除非您的图像是方形的。您可以将logcat filter设置为
NO filter
并查找崩溃报告(其中包含SEGFAULT),本地崩溃的显示方式与java崩溃的显示方式不同@德米特里兹。我尝试了你的解决方案,但它仍然抛出错误。但是我现在能够记录错误并更新问题。我相信
newMat.create(mat.rows,mat.rows,mat.type())应该是
mat.rows,mat.cols
,除非您的图像是方形的。您可以将logcat filter设置为
NO filter
并查找崩溃报告(其中包含SEGFAULT),本地崩溃的显示方式与java崩溃的显示方式不同@德米特里兹。我尝试了你的解决方案,但它仍然抛出错误。Bu我现在可以记录错误并更新问题。