我在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.c
有c 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文件,是否可以解决该错误? 感谢
答案 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风格函数(没有类,命名空间......)。文件,否则你会遇到和以前一样的问题。