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

宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述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对象检测哪些功能?
答案【Android NDK将参数传递给本机方法】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检测到的特征视为图像中的一个角。

    推荐阅读