博客背景:博主想用android显示c++处理后的相机数据,把画面实时展示出来,并研究如何通过CMakeLists.txt配置,采用自己写的c++文件,与android交互。转载请注明出处:Android Studio使用opencv4.5.5 CMakeLists.txt NDK配置
网上找到一个例子,存在问题
1:例子过于老旧(5年前的),其中的CMakeLists.txt文件可能由于CMake版本及opencv sdk版本不同,导致小编自己的环境无法运行(小编的CMake,opencv sdk都是当前最新的版本),且项目中关于opencv的部分代码不全 2:网上搜索大量关于CMakeLists.txt NDK开发使用opencv sdk时候的配置,大都是将opencv sdk中include文件夹还有so库文件copy到项目的cpp文件夹中,千篇一律,也不符合软件开发的思想
解决办法:
1、CMakeLists.txt采用当前最新版本3.18.1(当前Android Studio中最新的CMake版本是3.18.1) 2、opencv sdk采用CMakeLists.txt中配置引用的方式,不再copy到项目 3、修改例子中的部分jni代码,使其符合当前jni代码规范要求,或者可以理解为是最新的的jni 写法 另外,网上有大量博客在采用 java引用opencv的时候,导入module也是过于麻烦(不知道是当时opencv版本低的问题,还是出于其他考虑<怕包太大,不想把so库引用过来?>)。引用opencv module的时候,直接选sdk文件夹即可按module引用,可参考小编另一篇博客Android Studio配置OpenCV 4.4.0(进行边缘检测、霍夫直线识别)。
为了避免重复造轮子,找了两个例子,和二为一后运行, 实时显示 Opencv处理后的Camera图像 AndroidStudio NDK方法 https://github.com/sd707589/Camera1GLTest1 Android Studio 集成OpenCV 能运行的open cv demo例子 https://gitee.com/hugang2021/open-cv-demo-for-android
一、Android Studio新建C++工程
二、app build.gradle 配置
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId "opencv4unity.camera1gltest1"
minSdk 27
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ''
abiFilters 'armeabi-v7a'
//远程下载 libc++_shared.so
arguments '-DANDROID_STL=c++_shared'
}
}
ndk {
abiFilters 'armeabi-v7a'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/cpp/libs']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
externalNativeBuild {
cmake {
//path 'jni/CMakeLists.txt'
path file('src/main/cpp/CMakeLists.txt')
version '3.18.1'
}
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
三、修改CMakeLists.txt文件,直接上代码
第一种:采用引用本地下载的opencv sdk的方法(建议采用这种)
说明:最好是在新建C++工程后,系统生成的CMakeLists.txt基础上去修改CMakeLists.txt文件,而不是复制黏贴别人工程里的CMakeLists.txt文件。CMake版本不一样,直接整个CMakeLists.txt文件copy过来不一定能用,最好copy某一部分过来,而不是整个文件copy
cmake_minimum_required(VERSION 3.18.1)
project("camera1gltest1")
set(pathToOpenCv D:/opencv-4.5.5-android-sdk/OpenCV-android-sdk)
include_directories(${pathToOpenCv}/sdk/native/jni/include)
add_library(lib_opencv STATIC IMPORTED)
set_target_properties(lib_opencv
PROPERTIES
IMPORTED_LOCATION ${pathToOpenCv}/sdk/native/libs/armeabi-v7a/libopencv_java4.so
)
message("========= ${ANDROID_ABI} =========")
message("========= ${CMAKE_ANDROID_ARCH_ABI} =========")
add_library(
camera1gltest1
SHARED
native-lib.cpp
imgProcess.cpp
ExtractCase.cpp
)
find_library(
log-lib
log)
target_link_libraries(
camera1gltest1
lib_opencv
${log-lib}
android
jnigraphics
)
目录结构
第二种:采用复制opencv sdk中include文件夹即so库到项目的方法
cmake_minimum_required(VERSION 3.18.1)
project("camera1gltest1")
include_directories(include)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}")
message("========= ${ANDROID_ABI} =========")
message("========= ${CMAKE_ANDROID_ARCH_ABI} =========")
add_library(
camera1gltest1
SHARED
native-lib.cpp
imgProcess.cpp
ExtractCase.cpp
)
find_library(
log-lib
log)
target_link_libraries(
camera1gltest1
opencv_java4
${log-lib}
android
jnigraphics
)
目录结构
参考 Android 接入 OpenCV库的三种方式 实时显示 Opencv处理后的Camera图像 AndroidStudio NDK方法 https://github.com/sd707589/Camera1GLTest1 Android Studio 集成OpenCV 能运行的open cv demo例子 https://gitee.com/hugang2021/open-cv-demo-for-android Android基于CMake进行OpenCV开发配置 解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file Android开发中的NDK到底是什么?(详细解析+案例)
【Android NDK】cannot initialize a parameter of type ‘jboolean *’ (aka ‘unsigned char *’) with an rva 编译问题追踪: Expected elements are <{}codename>,<{}layoutlib>,<{}api-level> Warning: 意外的元素 (uri:““, local:“base-extension“)。所需元素为<{}codename>,<{}layoutlib>,<{}api-level> NDK does not contain any platforms问题解决 Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解 AS上利用NDK——CMake方法移植ORB SLAM算法到Android
Android Studio 配置 OpenCV4+ opencv配置 https://github.com/ITQmz/opencv Android Studio 中集成 OpenCV (Java 和 NDK 均可,不使用Manager) Android studio上在Java层和Native层配置OpenCV4.1.0 Android studio+opencv-4.1.0 开发环境搭建(一) 2021年7月1日:AndroidStudio集成opencv指南。 安卓数字图像处理实战(1)——集成并使用OpenCV4.4 Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了) Android Studio之配置OpenCV AndroidStudio配置opencv Android Studio OpenCV 4.5.2环境搭建 Android Studio4.0导入OpenCv4.3.0的方法步骤 Android Studio Cmake配置opencv 【Bug】did not have a source.properties file Android:NDK at D:\develop\androidAs\android-sdk\ndk-bundle did not have a source.properties file 2017年Android Studio做NDK情况调查
2022.04.25 0:18 扛不住了,休息 sh ylxy3
|