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将参数传递给本机方法的主要内容,如果未能解决你的问题,请参考以下文章