【发布时间】:2020-04-29 22:50:06
【问题描述】:
我们在 android studio 中开发一个项目。 我们尝试将图像数组从 java 部分发送到 cpp。 然后,我们想做一些图像处理动作,然后将图像发送回java端。
我们将每个图像表示为一个矩阵,并尝试创建要发送的矩阵数组。 我们尝试了几种不同的方法,但找不到正确的方法
Java:
static Mat[] imageMats = new Mat[3];
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.imageToUpload:
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, RESUALT_LOAD_IMAGE);
break;
case R.id.bottonUpload:
start(imageMats, counter)
public native Mat start(Mat[] imageMats, int N);
Cpp:
Mat
Java_com_example_trycpp_MainActivity_start(JNIEnv* env, jobject thisobject, jobjectArray imageMats, jint N){
Data D;
D.source = vector<cv::Mat>(N)
for (int i = 0; i < N; ++i)
{
D.sources[i] = (cv::Mat)(imageMats[i]); //error - _jobjectArray can't be cast to type "Mat": class "_jobjectAray" is not compatible with class "Mat"
}
}
我们也尝试在 cpp 部分使用这种方式,但应用程序崩溃了。当我们尝试调试时,我们看到了分段错误:
cpp:
jclass thisclass = env->GetObjectClass(thisobject);
jclass matclass = (env)->FindClass("org/opencv/core/Mat");
// Get methods and fields
jmethodID getPtrMethod = (env)->GetMethodID(matclass, "getNativeObjAddr", "()J");
jfieldID mrgbafieldid = env->GetFieldID(thisclass, "mRgba", "Lorg/opencv/core/Mat;");
jfieldID bufimgsfieldid = env->GetFieldID(thisclass, "bufImgs", "[Lorg/opencv/core/Mat;");
// Let's start: Get the fields
jobject mrgba = env->GetObjectField(thisobject, mrgbafieldid);
jobjectArray bufimgsArray = (jobjectArray)env->GetObjectField(thisobject, bufimgsfieldid);
D.sources[i] = *(cv::Mat*)env->CallLongMethod(env->GetObjectArrayElement(imageMats, i), getPtrMethod);
【问题讨论】:
标签: java android c++ android-studio opencv