在本机代码中使用 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.c
有c 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 应用程序开发的主要内容,如果未能解决你的问题,请参考以下文章