Android Studio搭建opencv開(kāi)發(fā)環(huán)境

文章不配圖片,閱讀需要有Android開(kāi)發(fā)基礎(chǔ)并熟悉Android Studio。

一、搭建基于Java開(kāi)發(fā)環(huán)境

以下內(nèi)容介紹如何搭建基于Java jni的opencv開(kāi)發(fā)環(huán)境。

1、準(zhǔn)備工作

opencv官網(wǎng)下載Android平臺(tái)開(kāi)發(fā)sdk并解壓,假設(shè)解壓后文件夾名為opencv-4.3.0-android-sdk。(此處以4.3.0為例)

2、創(chuàng)建項(xiàng)目

使用Android Studio(下簡(jiǎn)稱(chēng)AS)創(chuàng)建項(xiàng)目,假設(shè)項(xiàng)目名叫 cvdemo。

3、創(chuàng)建Module

創(chuàng)建新的Module作為opencv sdk,假設(shè)其名為opencv4。

之所以選擇創(chuàng)建新Module而不是導(dǎo)入,只是因?yàn)閛pencv提供的目錄結(jié)構(gòu)像是ADT,gradle將會(huì)有大量配置目錄的信息。

4、導(dǎo)入代碼

  • java代碼res資源放進(jìn)Module的對(duì)應(yīng)目錄;

  • 將存放本地動(dòng)態(tài)文件*.so的 /opencv-4.3.0-android-sdk/sdk/native/libs/ 目錄拷貝到opencv4的根目錄下,即:/cvdemo/opencv4/libs/。

  • 打開(kāi)opencv4build.gradle,在android內(nèi)添加sourceSets,如下:

android {
   ...//其他配置信息
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']//此目錄即為上述添加的目錄
        }
    }
   ...//其他配置信息
}
  • 刷新項(xiàng)目,項(xiàng)目下會(huì)出現(xiàn)名為jniLibs的虛擬目錄,并能查看到對(duì)應(yīng)平臺(tái)下的本地動(dòng)態(tài)文件*.so。

此時(shí)已經(jīng)可以依賴(lài)此Module實(shí)現(xiàn)Java開(kāi)發(fā)。


二、搭建基于C/C++開(kāi)發(fā)環(huán)境

雖然opencv提供面向Android的SDK,但是實(shí)際測(cè)試效果并不理想,特別在遍歷Mat的時(shí)候,那效率簡(jiǎn)直感人。所以采用本地開(kāi)發(fā)也是不錯(cuò)的選擇。

繼續(xù)配置以下內(nèi)容實(shí)現(xiàn)本地開(kāi)發(fā),以下內(nèi)容假設(shè)項(xiàng)目是在 app Module內(nèi)做本地開(kāi)發(fā)。

5.配置jni開(kāi)發(fā)

打開(kāi)項(xiàng)目的local.properties文件,AS默認(rèn)沒(méi)有配置ndk目錄,確保ndk目錄配置正確:

// 把sdk.dir和ndk.dir路徑修改成你自己的目錄
sdk.dir=/Applications/Android_SDK_Manager
ndk.dir=/Applications/Android_SDK_Manager/ndk/21.1.6352462

6.復(fù)制頭文件

找到頭文件*.h*.hpp所在的目錄/opencv-4.3.0-android-sdk/sdk/native/jni/include/,將其下的所有內(nèi)容(在4.3.0版本,其下只有一個(gè)opencv2目錄)拷貝到/opencv4/src/main/cpp/下。

因?yàn)轭^文件不是開(kāi)發(fā)源代碼,所以不需要添加到build.gradle里。
只要讓CMakeLists.txt能導(dǎo)入即可。

7. 創(chuàng)建CMakeLists.txt

創(chuàng)建目錄/cvdemo/app/src/main/cpp/,做為本地開(kāi)發(fā)代碼的目錄。

假設(shè)本地項(xiàng)目只有my_native.cpp一個(gè)文件,并將編譯成名為libmy_native.so的動(dòng)態(tài)文件。

在cpp目錄下創(chuàng)建文件CMakeLists.txt,內(nèi)容如下:

#CMakeLists.txt
#定義變量,名為opencv,值為opencv sdk(opencv4 Module)目錄,
#為了項(xiàng)目導(dǎo)入導(dǎo)出后不用修改,此處采用相對(duì)路徑定位。
#CMAKE_SOURCE_DIR變量為CMakeLists.txt所在目錄。
set(opencv ${CMAKE_SOURCE_DIR}/../../../../opencv4)

cmake_minimum_required(VERSION 3.4.1)

#配置加載native依賴(lài)
#引入opencv頭文件所在目錄
include_directories(${opencv}/src/main/cpp)
#引入opencv庫(kù)
add_library(
        opencv_java4
        SHARED
        IMPORTED)
#引入動(dòng)態(tài)文件
set_target_properties(
        opencv_java4
        PROPERTIES IMPORTED_LOCATION
        ${opencv}/libs/${ANDROID_ABI}/libopencv_java4.so)

#以下為開(kāi)發(fā)的本地庫(kù)的配置,此處不做詳解
add_library(
        my_native
        SHARED
        my_native.cpp)
find_library(
        log-lib
        log)
target_link_libraries(
        my_native
        #此處也要添加
        opencv_java4
        ${log-lib})

8. 修改build.gradle

接著修改本地源碼所在的Module(此處假定的是app)的build.gradle,內(nèi)容如下:

android {
    ...//其他配置信息
    defaultConfig {
        ...//其他配置信息
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                arguments "-DANDROID_STL=c++_shared"http://導(dǎo)入C++標(biāo)準(zhǔn)庫(kù)
            }
        }
        ndk {//需要編譯的平臺(tái)
            abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"http://cmake所在位置
            version "3.10.2"
        }
    }
    ...//其他配置
}
...//其他配置
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //最后別忘了引用opencv sdk Module
    implementation project(path: ':opencv4')
    ...//其他引用內(nèi)容
}

9、其他

  • my_native.cpp提供的jni接口函數(shù),本文不做贅述,可以查看其他相關(guān)文檔。
  • 因?yàn)楦鞣N配置相關(guān)路徑在build.gradle和CMakeList.txt里都可以修改,所以可以根據(jù)自己情況做修改。

參考:
HelloWorld CMake CMake中構(gòu)建靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)及其使用
NDK調(diào)用第三方so文件
Android studio配置Opencv開(kāi)發(fā)環(huán)境

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容