宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述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检测到的特征视为图像中的一个角。
推荐阅读
- Android Studio 3.0.1忽略Application.mk中的APP_ABI()
- 有没有办法在Android NDK上使用__int128_t()
- 从.aar文件Android中提取代码
- TravisCI中的NDK,CMake和Android
- 如何使用cmake和Android NDK在C ++中加载线程支持
- 不构建时Android Studio高CPU使用率
- Baresip与android
- Android NDK - 在没有Android Studio的情况下构建本机库
- Android Studio上的Cocos2d-x - 未列出新的CPP文件