在Android应用程序开发的本机代码中使用opencv
Using opencv in native code for Android app development
我在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
库。
这些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风格的函数(没有类,命名空间,…),否则你会遇到和以前一样的问题。
- 在nodejs中使用本机代码的最佳方法是什么?
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 可以从本机代码(如C++/Delphi)中使用.netCore DLL
- 使用 x86_64-w64-mingw32-g++ 编译 JNI C++本机代码
- 终止调用本机代码的 .Net 线程
- 从本机代码返回到托管代码会损坏返回的对象
- 我能否通过 JNI 调试在本机代码中创建的 JVM?
- Android 无法从本机代码调用 Java 方法 JNI
- 将自定义 Java 数据模型传递给我的本机代码
- 用于 JUnit 测试的本机代码未使用 'nar-maven-plugin' 编译
- 将本机C 代码转换为Java
- 有什么方法可以用本机C 代码替换Windows API计时器(settimer)
- 使用 Android Studio 使用本机代码编译 apk 时,如何在链接处删除 libgnustl_static.
- 如何在 Linux 上调试本机代码时自动附加到多个子进程
- 如何将 WebAssembly 编译成常规汇编/本机代码(或 Cpp 等)
- Android- AAR库的调试本机代码
- 无法使用cv :: imwrite保存垫子图像在JNI本机代码OPENCV中
- 如何在 Eclipse 中调试 Android 上的 OpenCV 示例的本机代码
- 在Android应用程序开发的本机代码中使用opencv
- openCV java代码传递点对象到本机代码(c++)