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

Using opencv in native code for Android app development

本文关键字:opencv 本机代码 Android 应用程序开发      更新时间:2023-10-16

我在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库。

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

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

(2)如果我没有选择,不得不使用。c文件,有没有办法消除这个错误?由于

我的假设是该文件被编译为"C"文件而不是" c++ "文件,因为扩展名为". C"。这意味着你不能在你的jni.c中使用任何"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风格的函数(没有类,命名空间,…),否则你会遇到和以前一样的问题。