[Android] 안드로이드 용 OpenCV 빌드하기-3

2024. 1. 24. 10:53모바일프로그래밍/안드로이드

728x90

저번 글에서 부터 시작 된 마지막으로 샘플을 빌드 해 보도록 하겠습니다.

 

 

[Android] 안드로이드 용 OpenCV 빌드하기-2

저번글에 계속해서 안드로이드 용 OpenCV 를 빌드 해보도록 합니다. OpenCV 버전은 4.8.1 현재 최신 ...

blog.naver.com

 

내가 가지고 있는 것은 갤럭시 탭 계열이라서 CPU 아키텍쳐는

arm64-v8a
 

입니다. 그래서 크로스컴파일들 하더라고 위의 아키텍쳐에 해당하는 소스만 빌드 되어 나오면 됩니다. 그게 전제죠...

 

1. 빌드를 위한 환경 변수

빌드를 위해서 다음의 환경 변수를 사용 했습니다.

SET JAVA_HOME=C:\DEV\SDK\JDK\jdk-19.0.1
SET ANDROID_HOME=C:\DEV\SDK\android-sdk

SET OPECV_VER=4.8.1
@ECHO SET OPECV_VER=4.7.0
SET NDK_VER=26.1.10909125
@ECHO SET NDK_VER=25.1.8937393
@ECHO SET GRADLE_VER=7.6.3
SET GRADLE_VER=8.1
@ECHO SET ARCH=armeabi-v7a
SET ARCH=arm64-v8a

SET GRADLE_HOME=C:\DEV\Tools\gradle-%GRADLE_VER%
SET ANT_HOME=C:\DEV\Tools\apache-ant-1.9.16
SET PYTHON_HOME=C:\DEV\SDK\anaconda3
SET ANDROID_NDK_HOME=%ANDROID_HOME%\ndk\%NDK_VER%

SET GRADLE_USER_HOME=%GRADLE_HOME%
SET ANDROID_NDK=%ANDROID_NDK_HOME%
SET CMAKE_HOME=%ANDROID_HOME%\cmake\3.22.1
SET CV_HOME=C:\DEV\SDK\opencv-%OPECV_VER%

SET PATH=%PYTHON_HOME%;%ANT_HOME%\bin;%CMAKE_HOME%\bin;%JAVA_HOME%\bin;%ANDROID_HOME%\cmdline-tools\bin;.;%PATH%
 

2. 빌드 스크립트

CMake 를 위한 빌드이면서 자바를 빌드 할 때는 gradle 을 사용 하는 것 같습니다.

따라서 위의 환경 변수를 모아서 다음과 같은 빌드 스크립트를 만들었습니다.

저번 빌드 스크립트와 약간 틀립니다.

cmake.exe -G"MinGW Makefiles" ^
-DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%\build\cmake\android.toolchain.cmake   ^
-DCMAKE_MAKE_PROGRAM=%ANDROID_NDK%\prebuilt\windows-x86_64\bin\make.exe ^
-DCMAKE_INSTALL_PREFIX:PATH=%CV_HOME%/output/%ARCH%/lib/ ^
-DBUILD_SHARED_LIBS=OFF  ^
-DBUILD_JAVA=ON   ^
-DBUILD_TESTS=OFF  ^
-DBUILD_PERF_TESTS=OFF  ^
-DBUILD_ANDROID_EXAMPLES=ON  ^
-DBUILD_opencv_java=ON   ^
-DBUILD_FAT_JAVA_LIB=ON ^
-DBUILD_ANDROID_PROJECTS=ON ^
-DCMAKE_BUILD_TYPE=Release ^
-DPARALLEL_ENABLE_PLUGINS=OFF  ^
-DANDROID_SDK=%ANDROID_HOME%   ^
-DANDROID_GRADLE_PLUGIN_VERSION=7.4.0 ^
-DANDROID_NATIVE_API_LEVEL=android-24 ^
-DANDROID_COMPILE_SDK_VERSION=31 ^
-DANDROID_MIN_SDK_VERSION=27 ^
-DANDROID_TARGET_SDK_VERSION=31 ^
-DGRADLE_VERSION=%GRADLE_VER% ^
-DANDROID_ABI=%ARCH% ^
-DOPENCV_EXTRA_MODULES_PATH=C:\DEV\SDK\opencv-%OPECV_VER%\opencv_contrib\modules  ^
-DJAVA_AWT_INCLUDE_PATH:PATH=%JAVA_HOME%\include   ^
-DJAVA_AWT_LIBRARY:FILEPATH=%JAVA_HOME%\include\jawt.h   ^
-DJAVA_INCLUDE_PATH:PATH=%JAVA_HOME%\include   ^
-DJAVA_INCLUDE_PATH2:PATH=%JAVA_HOME%\include\win32   ^
-DJAVA_JVM_LIBRARY:FILEPATH=%JAVA_HOME%\include\jni.h   ^
-DANT_EXECUTABLE:FILEPATH=%ANT_HOME%/bin/ant.bat ..
 

특히 다음 부분이 틀리죠

-DBUILD_ANDROID_EXAMPLES=ON  
 

아래래 파일에 대한 설정은 저번 글에서 언급 했으니, 그냥 지나가겠습니다.

~\opencv-4.8.1\opencv\samples\android\build.gradle.in
 

그 다음으로 변경 될 파일들이 두개 있습니다.

코틀린 사용을 무시하고, ndk 빌드 시 ABI 를 정해 주는 것 까지 넣어 줍니다.

~\opencv-4.8.1\opencv\modules\java\android_sdk\build.gradle.in
 
apply plugin: 'com.android.library'
//@KOTLIN_PLUGIN_DECLARATION@ <==

def openCVersionName = "@OPENCV_VERSION@"
def openCVersionCode = ((@OPENCV_VERSION_MAJOR@ * 100 + @OPENCV_VERSION_MINOR@) * 100 + @OPENCV_VERSION_PATCH@) * 10 + 0

println "OpenCV: " +openCVersionName + " " + project.buildscript.sourceFile

android {
    @OPENCV_ANDROID_NAMESPACE_DECLARATION@
    compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@

    defaultConfig {
        minSdkVersion @ANDROID_MIN_SDK_VERSION@
        targetSdkVersion @ANDROID_TARGET_SDK_VERSION@

        versionCode openCVersionCode
        versionName openCVersionName

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=@ANDROID_STL@"
                targets "opencv_jni_shared"
            }
        }
==>		
		ndk {
            abiFilters '@ANDROID_ABI@' 
		}
<==
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_@ANDROID_GRADLE_JAVA_VERSION_INIT@
        targetCompatibility JavaVersion.VERSION_@ANDROID_GRADLE_JAVA_VERSION_INIT@
    }

    @ANDROID_GRADLE_BUILD_FEATURE_AIDL@

    buildTypes {
        debug {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
        }
        release {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['native/libs']
            java.srcDirs = ['java/src']
            aidl.srcDirs = ['java/src']
            res.srcDirs = ['java/res']
            manifest.srcFile 'java/AndroidManifest.xml'
        }
    }

    externalNativeBuild {
        cmake {
            path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt')
        }
    }
}

dependencies {
}
 
~\opencv-4.8.1\opencv\modules\java\android_sdk\android_gradle_lib\build.gradle
 
apply plugin: 'com.android.library'
//@KOTLIN_PLUGIN_DECLARATION@   <==

def openCVersionName = "@OPENCV_VERSION@"
def openCVersionCode = ((@OPENCV_VERSION_MAJOR@ * 100 + @OPENCV_VERSION_MINOR@) * 100 + @OPENCV_VERSION_PATCH@) * 10 + 0

android {
    compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@

    defaultConfig {
        minSdkVersion @ANDROID_MIN_SDK_VERSION@
        targetSdkVersion @ANDROID_TARGET_SDK_VERSION@

        versionCode openCVersionCode
        versionName openCVersionName

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=@ANDROID_STL@"
                targets "opencv_jni_shared"
            }
        }
==>		
		ndk {
            abiFilters '@ANDROID_ABI@' 
		}
<==
    }

    buildTypes {
        debug {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
        }
        release {
            packagingOptions {
                doNotStrip '**/*.so'  // controlled by OpenCV CMake scripts
            }
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['../../jni']
            java.srcDirs = ['src']  // TODO Use original files instead of copied into build directory
            aidl.srcDirs = ['src']
            res.srcDirs = ['@OpenCV_SOURCE_DIR@/modules/java/android_sdk/android_gradle_lib/res']
            manifest.srcFile 'AndroidManifest.xml'
        }
    }

    externalNativeBuild {
        cmake {
            path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt')
        }
    }
}

dependencies {
}
 

그 다음은 샘플 파일들 중에 jni 를 사용하는 것들에 대한 ABI 설정 파일 변경 입니다.

~opencv-4.8.1\opencv\samples\android\face-detection\build.gradle.in
 
apply plugin: 'com.android.application'

android {
    compileSdkVersion @ANDROID_COMPILE_SDK_VERSION@
    defaultConfig {
        applicationId "org.opencv.samples.facedetect"
        minSdkVersion @ANDROID_MIN_SDK_VERSION@
        targetSdkVersion @ANDROID_TARGET_SDK_VERSION@
        versionCode 301
        versionName "3.01"

        externalNativeBuild {
            cmake {
                arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/@ANDROID_PROJECT_JNI_PATH@"@OPENCV_ANDROID_CMAKE_EXTRA_ARGS@
                targets "detection_based_tracker"
            }
        }
==>		
		ndk {
            abiFilters '@ANDROID_ABI@' 
		}
<==
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            java.srcDirs = @ANDROID_SAMPLE_JAVA_PATH@
            aidl.srcDirs = @ANDROID_SAMPLE_JAVA_PATH@
            res.srcDirs = @ANDROID_SAMPLE_RES_PATH@
            manifest.srcFile '@ANDROID_SAMPLE_MANIFEST_PATH@'
        }
    }
    externalNativeBuild {
        cmake {
             path '@ANDROID_SAMPLE_JNI_PATH@/CMakeLists.txt'
        }
    }
}

dependencies {
    //implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(':opencv')
}
 
~\opencv-4.8.1\opencv\samples\android\tutorial-2-mixedprocessing\build.gradle.in
 

4. 빌드 오류

여전히 못 고친 오류 중에 빌드하는 중 나는 오류가 다음 파일에서 발생 합니다.

~\opencv-4.8.1\opencv\build\opencv_android\build.gradle
 

위 파일은 아래 파일에서 주석 처리 한 내용 안에 옵션이 추가 되면서 해당 옵션을 삭제 해야 하는 경우가 발생 합니다.

~\opencv-4.8.1\opencv\samples\android\build.gradle.in
 

5. 결과

위의 내용을 고쳐서 다시 빌드 하면, 다음과 같이 output 이라는 폴더 안에 opencv sdk 가 생성 된 것을 확인 할 수 있습니다.

 

이상.

728x90