- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 C++ 的 Android native 程序中使用 openCV。
我的 ndk-build 版本是 14,我使用的是 Android Studio 3.3 RC3 和 OpenCV 4.0。
当我尝试为相机添加一个简单的人脸检测程序并尝试使用 ndk-build 构建它时,它给了我以下错误:
error: undefined reference to 'cv::CascadeClassifier::load(std::string const&)'
这是我的一些代码:
void *frameRetriever(void *p){
...
const std::string face_cascade_name = "/data/local/tmp/haarcascade_frontalface_alt.xml";
cv::CascadeClassifier face_cascade;
face_cascade.load(face_cascade_name);
...
}
我试过用
cv::CascadeClassifier face_cascade = cv::CascadeClassifier(face_cascade_name)
代替加载函数,甚至尝试
void loadCascade(std::string filepath){
cv::CascadeClassifier face_cascade;
if ( !face_cascade.load(filepath) ){
LOGE("--Error Loading face cascade\n");
}
}
这些仍然给了我对 ndk-build 错误的 undefined reference 。(face_cascade_name
中的文件对所有用户都是rwx)
我已经链接了我的 Android.mk
中的所有库文件:
...
LOCAL_LDLIBS += -L$(OPENCV_ANDROID_SDK)/libs/armeabi-v7a/
LOCAL_LDLIBS += -lopencv_core
LOCAL_LDLIBS += -lopencv_calib3d
LOCAL_LDLIBS += -lopencv_imgproc
LOCAL_LDLIBS += -lopencv_objdetect
LOCAL_LDLIBS += -lopencv_features2d
LOCAL_LDLIBS += -lopencv_flann
LOCAL_LDLIBS += -lopencv_stitching
LOCAL_LDLIBS += -lopencv_video
LOCAL_LDLIBS += -lopencv_dnn
LOCAL_LDLIBS += -lopencv_highgui
LOCAL_LDLIBS += -lopencv_imgcodecs
LOCAL_LDLIBS += -lopencv_ml
LOCAL_LDLIBS += -lopencv_photo
LOCAL_LDLIBS += -lopencv_videoio
...
我确实拥有所有这些 OpenCV 库作为 .so
<myProject>/app/src/main/libs/armeabi-v7a/
下的文件
至于构建 OpenCV 库,我使用以下 bash 脚本:
#!/bin/bash
if [ ! -d "./android_build/" ]; then
mkdir android_build
fi
if [ ! -d "./build/" ]; then
mkdir build
fi
rm -rf android_build/out/
cd build
cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake \
-DCMAKE_BUILD=Release \
-DBUILD_DOCS=OFF \
-DBUILD_JAVA=OFF \
-DBUILD_ANDROID_EXAMPLES=OFF \
-DBUILD_ANDROID_PROJECTS=OFF \
-DBUILD_SHARED_LIBS=ON \
-DANDROID_NDK=${ANDROID_NDK} \
-DANDROID_NATIVE_API_LEVEL=android-19 \
-DANDROID_SDK_TARGET=19 \
-DANDROID_ABI="armeabi-v7a with NEON" \
-DANDROID_TOOLCHAIN=clang \
-DANDROID_STL=c++_shared \
-DCV_TRACE=OFF \
-DWITH_IPP=OFF \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DBUILD_opencv_core=ON \
-DBUILD_opencv_imgproc=ON \
-DBUILD_opencv_calib3d=ON \
-DBUILD_opencv_imgcodecs=ON \
-DBUILD_opencv_dnn=ON \
-DBUILD_opencv_flann=ON \
-DBUILD_opencv_ml=ON \
-DBUILD_opencv_objdetect=ON \
-DBUILD_opencv_photo=ON \
-DBUILD_opencv_stiching=ON \
-DBUILD_opencv_videoio=ON \
-DBUILD_opencv_highgui=ON \
-DCMAKE_INSTALL_PREFIX:PATH=$(pwd)/../android_build/out \
-DWITH_CUDA=OFF \
-DWITH_TBB=OFF \
-DHAVE_OPENCL=ON \
-DOPENCL_FOUND=ON \
-DWITH_OPENCL=ON \
-DHAVE_OPENCL_STATIC=ON \
-DOPENCL_LIBRARY=$(pwd)/../libopencl-stub/libOpenCL.so \
-DOPENCL_INCLUDE_DIRS=$(pwd)/../libopencl-stub/include \
cmake -LA
make -j4
make install
在测试了一些东西之后,我注意到在其参数中有“const String &
”的其他 OpenCV 函数在 ndk-build 上给我同样的错误。 (其他 OpenCV 函数,如 cvtColor 完美运行)。
如有任何帮助,我们将不胜感激。
最佳答案
显然,更改 makefile 中的某些值可以解决问题。
在 Application.mk 中,改变 APP_STL := gnuSTL_shared
到 c++_shared 并注释掉 NDK_TOOLCHAIN_VERSION。在 Android.mk 中,注释掉一些 LOCAL_CPPFLAG。
构建它并解决了问题。
关于c++ - ndk-build 给我 "error: undefined reference"到 cv::CascadeClassifier::load(std::string const&) 即使在我链接库之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54432541/
如果您想使用 String.Concat() 连接 5 个或更多字符串,则它会使用 Concat(String[])。 为什么不一直使用 Concat(String[]) 而不再需要 Concat(S
今天在使用 String 时,我遇到了一种我以前不知道的行为。我无法理解内部发生的事情。 public String returnVal(){ return "5";
似乎在我所看到的任何地方,都有一些过时的版本,这些版本不再起作用。 我的问题似乎很简单。我有一个Java类,它映射到derby数据库。我正在使用注释,并且已经成功地在数据库中创建了所有其他表,但是在这
一、string::size_type() 在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据
我正在尝试将数据保存到我的 plist 文件中,其中包含字符串数组的定义。我的plist - enter image description here 我将数据写入 plist 的代码是 -- let
我有一个带有键/值对的 JavaScript 对象,其中值是字符串数组: var errors = { "Message": ["Error #1", "Error #2"], "Em
例如,为了使用相同的函数迭代 List 和 List> ,我可以编写如下内容: import java.util.*; public class Test{ public static voi
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
这是我的 jsp 文件: 我遇到了错误 The method replace(String, String, String) in the type Functions is not appl
我需要一些帮助。我有一个方法应该输出一个包含列表内容的 txt 文件(每行中的每个项目)。列表项是字符串数组。问题是,当我调用 string.Join 时,它返回文字字符串 "System.Strin
一位同事告诉我,使用以下方法: string url = "SomeURL"; string ext = "SomeExt"; string sub = "SomeSub"; string s
给定类: public class CategoryValuePair { String category; String value; } 还有一个方法: public
我正在尝试合并 Stream>>对象与所有 Streams 中的键一起映射到单个映射中. 例如, final Map someObject; final List>> list = someObjec
在这里使用 IDictionary 的值(value)是什么? 最佳答案 使用接口(interface)的值(value)始终相同:切换到另一个后端实现时,您不必更改客户端代码。 请考虑稍后分析您的代
我可以知道这两个字典声明之间的区别吗? var places = [String: String]() var places = [Dictionary()] 为什么当我尝试以这种方式附加声明时,只有
在 .NET 4.0 及更高版本中存在 string.IsNullOrWhiteSpace(string) 时,在检查字符串时使用 string.IsNullOrEmpty(string) 是否被视为
这个名字背后的原因是什么? SS64在 PowerShell 中解释此处的字符串如下: A here string is a single-quoted or double-quoted string
我打算离开 this 文章,尝试编写一个接受字符串和 &str 的函数,但我遇到了问题。我有以下功能: pub fn new(t_num: S) -> BigNum where S: Into {
我有一个结构为 [String: [String: String]] 的多维数组。我可以使用 for 循环到达 [String: String] 位,但我不知道如何访问主键(这个位 [String:
我正在尝试使用 sarama(管理员模式)创建主题。没有 ConfigEntries 工作正常。但我需要定义一些配置。 我设置了主题配置(这里发生了错误): tConfigs := map[s
我是一名优秀的程序员,十分优秀!