мы работаем над проектом в android студии. мы пытаемся отправить массив изображений из 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);