Я пытаюсь интегрировать пример
Использовать OpenCL в приложении для Android на основе предварительного просмотра камеры
в AndroidStudio 3.4 на MacOs Mojave.
Проблема
Я заканчиваю ошибками на классах стандартных библиотек, которые не найдены:
- в
cl.hpp
файле atomic
не найден
In file included from <project_path>/app/src/main/cpp/CLprocessor.cpp:7:
<opencl_lib_path>/CL/cl.hpp:176:10: fatal error: 'atomic' file not found
#include <atomic>
^~~~~~~~
1 warning and 1 error generated.
- in
CLprocessor.cpp
string
, vector
и extension
не могут быть разрешены.
CLprocessor.cpp
было найдено здесь
Что я сделал
- Я взял код для учебника (нашел здесь )
- Я скачал заголовки для OpenCl, нашел здесь
- Я скачал
cl.hpp
здесь
- Я обновил
CMakelist.txt
CMakeList
В моем CMakelist.txt
я добавил пути к
- OpenCV
- заголовки OpenCL и
cl.hpp
файл
У меня также была проблема с сужением типов, я решил ее, добавив set(CMAKE_CXX_FLAGS "-Wc++11-narrowing")
В конце мой CmakeLists
выглядит следующим образом:
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.6)
# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(target mixed_sample)
project(${target} CXX)
# Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
# "OpenCV_DIR" to a directory containing one of the above files. If "OpenCV"
# provides a separate development package or SDK, be sure it has been
# installed.
set(OpenCV_DIR "<path_to_lib>/OpenCV-android-sdk/sdk/native/jni/")
message(STATUS "+++ OpenCV_DIR: " ${OpenCV_DIR})
# OpenCl
set(OpenCL_HEADER_CL "<path_to_lib>/OpenCL-Headers-master")
message(STATUS "+++ OpenCL_HEADER: " ${OpenCL_HEADER_CL})
include_directories( ${OpenCL_HEADER_CL} )
set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})
file(GLOB srcs *.cpp *.c)
file(GLOB hdrs *.hpp *.h)
# fix error: non-constant-expression cannot be narrowed from type 'int' to 'size_t' (aka 'unsigned long') in initializer list [-Wc++11-narrowing]
set(CMAKE_CXX_FLAGS "-Wc++11-narrowing")
include_directories("${CMAKE_CURRENT_LIST_DIR}")
add_library(${target} SHARED ${srcs} ${hdrs})
target_link_libraries(${target} ${ANDROID_OPENCV_COMPONENTS} -lGLESv2 -lEGL -lOpenCL)
Вопрос
У меня такое ощущение, что проблема гораздо глубже, чем просто отсутствие некоторых библиотек, поэтому я ищу, как заставить OpenCl работать над проектом Android на MacOs, но я не смог найти никакой информации.
Кто-нибудь может подсказать мне правильный путь, чтобы получить эту работу?
Примечания
OpenCV
Я использую OpenCv4.1.0 для Android найдено здесь
и OpenCV добавлен в качестве модуля в моем проекте Android. Работали следующие коды, данные OpenCV:
Gradle
Я новичок в проблемах OpenCV, OpenCL, поэтому я не знаю, уместно ли это, но мой build.gradle
:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.aklal.andropencpp"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native/jni" // , "-DANDROID_ARM_NEON=TRUE"
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
implementation project(':opencv410')
}
Структура проекта
Все коды cpp и CMakeList.txt
находятся под /src/main/cpp
, а не в папке jni
, как в коде, предоставленном OpenCv. Этот способ использования файла cpp сработал, когда я попробовал другой код OpenCv с файлами cpp.