Android NDK将参数传递给本机方法

use*_*888 4 android opencv android-ndk

我正在使用NDK框架研究2.4.5版本的OpenCV4Android SDK,使用它我可以在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));
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

在MainActivity中,有以下方法:

 public native void FindFeatures(long matAddrGr, long matAddrRgba);
Run Code Online (Sandbox Code Playgroud)

因此,它作为Mat对象的本机地址作为参数传递,但是它如何成为C语言中的矩阵?从FastFeatureDetector对象检测到哪些功能?

Jon*_*rin 5

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;
...
Run Code Online (Sandbox Code Playgroud)

这就是它成为的地方cv::Mat(Mat*)将地址addrGray分别addrRgba指向的内容转换为cv::Mat“ 指向”的指针。然后,将这个新创建的指针所指向的值mGr(分别为mRgb)放入a中cv::Mat

换句话说,您只需要给C / C ++一个内存中的地址,就必须确保那里的内容实际上是有效的cv::Mat


关于您的第二个问题,FAST检测器检测图像中的兴趣点(即,包含大量信息的点)。这个想法是要能够识别多个不同图像上的那些点。为简化起见,您可以将FAST检测到的特征视为图像的一角。