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

时间:2014-07-24 07:06:33

标签: android c++ opencv android-ndk namespaces

我在namespace应用中使用ndk-build错误构建了Android本机代码。错误示例是

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个库。

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

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

(2)如果我没有选择并且必须使用该.c文件,是否可以解决该错误? 感谢

1 个答案:

答案 0 :(得分:1)

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

所以问题不是你包含一个名为&#34; .hpp&#34;的文件,而是这个文件包含&#34; C ++&#34;代码,&#34; C&#34;编译器无法处理。

这个问题的一个解决方案是只使用&#34; C&#34; opencv中的函数(例如&#34; opencv2 / imgproc / imgproc_c.h&#34;而不是&#34; opencv2 / imgproc / imgproc.hpp&#34;)。但是,你的功能&#34; detection_based_tracker.hpp&#34;可能没有&#34; C&#34;版本,据我所见。

另一个选项是添加第二个文件&#34; function.cpp&#34;使用&#34; C ++&#34;使用opencv的函数。函数来自&#34; function.cpp&#34;可以在文件中声明&#34; functions.h&#34;并包含在你的&#34; jni.c&#34;中,所以你仍然可以使用opencv c ++函数。但是,在你的&#34; function.h&#34;中只注意使用C风格函数(没有类,命名空间......)。文件,否则你会遇到和以前一样的问题。