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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK将参数传递给本机方法相关的知识,希望对你有一定的参考价值。

我正在研究2.4.5版本的OpenCV4android SDK和NDK框架,我可以在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对象检测哪些功能?

答案

Java中的FindFeatures在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

换句话说,你只给C / C ++一个内存中的地址,你必须确保实际上有一个有效的cv::Mat


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

以上是关于Android NDK将参数传递给本机方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同的参数传递给片段 [导航] Android

Android - 如何将自定义对象传递给片段

JNI将参数传递给c ++的方法

将参数传递给 XML 布局中定义的片段

Android 数据绑定将参数传递给 onClick 方法

如何将变量/参数传递给android视图方法