java - 将 InputArrayOfArrays 从 java 类传递到 JNI

标签 java android c++ opencv android-ndk

我在 JNI cpp 文件中生成了以下方法,

JNIEXPORT void JNICALL Java_com_idesign_opencvmaketest_MainActivity_train
        (JNIEnv *env, jobject thisObj, jobjectArray images, jobjectArray labels) {
    Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();

    /** make a call to 
    *   CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels) = 0;
    **/
    model->train(images, labels);
}

现在我得到了

Parameter type mismatch: Types 'const _InputArray' and 'jobjectArray' are not compatible

model->train(images, labels); 中的 imageslabels;

那么 MainActivity_train 方法中图像和标签的参数类型是什么?

以及如何使用正确的参数类型从 Java 类调用此 JNI 方法?

我是 OpenCv 和 JNI 的新手。

最佳答案

jobjectArray不是 Mat . org.opencv.core.Mat类有一个 getNativeObjAddr()返回类型为 long 的方法,可以解释为指向 Mat 的指针.有关 OpenCV Java API 的更多信息 here , 示例代码 here .

方法

CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels)

接受 std::vector<cv::Mat> images作为来源和 std::vector<int> lables作为标签。据我所知,您需要将不止一张图片传递给您的 JNI方法。参见示例 here .

JNIEXPORT void JNICALL Java_com_idesign_opencvmaketest_MainActivity_train
        (JNIEnv *env, jobject thisObj, jlong images, jlong labels) {

Mat& matImage  = *(Mat*)images; //to create one Mat image, you need an array of Mat
Mat& matLabels = *(Mat*)labels; // create a Mat from labels

/*
To pass correct parameters, you would do:

std::vector<cv::Mat> vecImages;
vecImages.push_back(matImage);

std::vector<int> vecLabels;
//put your labels to vecLabels here

model->train(vecImages,vecLabels);
*/

Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();

/** make a call to 
*   CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels) = 0;
**/
model->train(matImages, matLabels); // function requires ArrayofMats and ArrayofInts
}

关于java - 将 InputArrayOfArrays 从 java 类传递到 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46111034/

相关文章:

android - 裁剪的 FloatingActionButton

c++ - 在 C++ 中检查用户输入的正确值

java - 使用函数式 java 快速失败(或者更确切地说,返回)

java - 序列化 vector

java - 检查用户是否选择了单选按钮之一java

c++ - (没有)在数值表达式中使用时隐式转换?

c++ - C++ 中的 for_each()

java - OSX 中的 SWT 系统托盘

android - Android WebView 是否支持 frameset 标签?

android帮助从kml获取多个地标位置