Android NDK 传递参数给本地方法

6
我正在学习OpenCV4Android SDK,使用NDK框架的2.4.5版本,可以在Android环境中使用C/C++编写的本地代码。但是我不太明白参数是如何从Android传递到C语言中的。
例如,在'mixedprocessing'示例中,目录'jni'中有一个名为'jni_part'的.cpp文件,其代码如下:
#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

extern "C" {

  JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);

  JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba) {
    Mat& mGr  = *(Mat*)addrGray;
    Mat& mRgb = *(Mat*)addrRgba;
    vector<KeyPoint> v;

    FastFeatureDetector detector(50);
    detector.detect(mGr, v);
    for( unsigned int i = 0; i < v.size(); i++ ) {
      const KeyPoint& kp = v[i];
      circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));
    }
  }

}

在MainActivity中有一个方法:
 public native void FindFeatures(long matAddrGr, long matAddrRgba);

因此,将Mat对象的本地地址作为参数传递,但它如何在C中成为矩阵呢? FastFeatureDetector对象检测到哪些特征?

1个回答

6

FindFeatures在Java中调用其在C/C++中的完全等效函数:

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba){
Mat& mGr  = *(Mat*)addrGray;
Mat& mRgb = *(Mat*)addrRgba;
...

这是成为 cv::Mat 的地方。 (Mat*) 将由地址 addrGray(分别为 addrRgba)指向的内容转换为“指向 cv::Mat 的指针”。然后,这个新创建的指针所指的值被放入 mGr(分别为 mRgb),它是一个 cv::Mat
换句话说,你只需要给出内存中的地址,确保那里实际上是一个有效的 cv::Mat,然后就可以将其提供给 C/C++。
关于您的第二个问题,FAST 检测器会检测图像中的感兴趣点(即包含大量信息的点)。其想法是能够在多个不同的图像上识别这些点。简单来说,你可以将 FAST 检测到的 特征 视为图像中的角落。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接