在本机代码中使用 opencv 进行 Android 应用程序开发

Posted

技术标签:

【中文标题】在本机代码中使用 opencv 进行 Android 应用程序开发【英文标题】:Using opencv in native code for Android app development 【发布时间】:2014-07-24 07:06:33 【问题描述】:

我在我的android 应用程序中使用ndk-build 构建本机代码时出现namespace 错误。错误样本是

C:/adt-bundle-windows-x86/ndk/sources/cxx-stl/gnu-libstdc++/4.6/include/bits
/allocator.h:54:1: error: unknown type name 'namespace'
C:/adt-bundle-windows-x86/ndk/sources/cxx-stl/gnu-libstdc++/4.6/include/bits
/allocator.h:55:1: error: expected ',' or ';' before '' token

对于OpenCV设置,我的Application.mk文件是

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi
APP_PLATFORM := android-10 

这意味着我在编译本机代码时使用gnu-libstdc++

我的jni.cc extension。那是我从我的第三方那里收到的,他们更喜欢.c extension,好像他们必须更改为.cpp extension,他们必须在其他库中进行很多更改。

到目前为止还可以,我为 OpenCV 进行了本地开发的所有项目设置,如果我这样做了ndk-build,我可以制作.so 库。

当我将OpenCV's 头文件#include <opencv2/contrib/detection_based_tracker.hpp> 包含到jni.c 中时,那些namespace error 的问题发生了,我得到了很多命名空间错误。如果我将 #include <opencv2/contrib/detection_based_tracker.hpp> 包含到 cpp 文件中,则不会出错。 我的问题是

(1)错误是因为在.c文件中使用了.hpp文件吗?

(2)如果我别无选择,必须使用那个 .c 文件,有没有办法消除这个错误? 谢谢

【问题讨论】:

【参考方案1】:

我的假设是该文件被编译为“C”文件而不是“C++”文件,因为扩展名为“.c”。这意味着您不能在 jni.c、wike 类或命名空间中使用任何“C++”代码。但是,这些显然在您正在使用的文件“detection_based_tracker.hpp”中使用。

所以问题不在于您包含一个名为“.hpp”的文件,而是该文件包含“C”编译器无法处理的“C++”代码。

解决此问题的一个方法是仅使用 opencv 中的“C”函数(例如“opencv2/imgproc/imgproc_c.h”而不是“opencv2/imgproc/imgproc.hpp”)。但是,据我所知,您的函数“detection_based_tracker.hpp”可能没有“C”版本。

另一种选择是添加第二个文件“function.cpp”,其中包含使用 opencv 的“C++”函数。 “function.cpp”中的函数可以在文件“functions.h”中声明并包含在“jni.c”中,因此您仍然可以使用opencv c++函数。请注意只在“function.h”文件中使用 C 风格的函数(没有类、命名空间等),否则您将遇到与以前相同的问题。

【讨论】:

以上是关于在本机代码中使用 opencv 进行 Android 应用程序开发的主要内容,如果未能解决你的问题,请参考以下文章

使用霍夫变换opencv android进行矩形文档检测

什么是 API 19 中 OpenCV 的“未找到本机方法”错误?

使用 OpenCV 和 C 裁剪图像

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

ubuntu虚拟机使用本机摄像头教程

通过 JNI 执行 OpenCV 本机函数的问题