【问题标题】:Parameter Passing Between Android and JNIAndroid和JNI之间的参数传递
【发布时间】:2012-03-27 20:43:50
【问题描述】:

我正在处理带有 OpenCV 的 Android 应用程序和 JNI 之间的参数传递。在 Java 中使用 OpenCV 库,我在 Android 应用程序代码中有类似的内容。

Android OpenCV Java 代码:

Mat mat; //Mat object with data
Rect rect; //Rect object with data

//call to the native function
int resProc = Native.processImages_native(rect, mat); 

C 代码:

JNIEXPORT jint JNICALL Java_com_test_Native_processImages_1native
(JNIEnv*, jclass, CvRect, Mat);

...

jint Java_com_test_Native_processImages_1native
(JNIEnv* env, jclass jc, CvRect rect, Mat mat){
    int res = processImages(rect, mat);
    return (jint)res;
}

...

int processImages(CvRect rect, Mat mat)
{               
    IplImage *ipl_Img = &mat.operator IplImage(); // here FAILS
    CvRect rect_value = rect;
}

但是当我尝试在 C 代码中从 (Mat) 到 (IplImage *) 进行反转换时,我的应用程序失败了。所以我的问题是关于如何将 CvRect 和 Mat 对象从我的 Android Java 代码传递给 JNI。有没有更好的方法来做到这一点?

非常感谢。

【问题讨论】:

    标签: android opencv java-native-interface native-code


    【解决方案1】:

    看起来Java Mat 和C Mat 对象之间存在差异,但是您可以传递Java Mat 对象存储的本机Mat 对象的地址。将您的代码更改为以下内容:

    Android OpenCV Java 代码:

    //call to the native function
    int resProc = Native.processImages_native(rect, mat.getNativeObjAddr());
    

    C 代码:

    jint Java_com_test_Native_processImages_1native
    (JNIEnv* env, jclass jc, CvRect rect, jlong mat){
        int res = processImages(rect, *((Mat*)mat));
        return (jint)res;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多