저번 글에서 부터 시작 된 마지막으로 샘플을 빌드 해 보도록 하겠습니다.
내가 가지고 있는 것은 갤럭시 탭 계열이라서 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
3. 빌드 하기 전 고쳐야 할 것들
gradle 버전이 올라 가면서, 바뀌는 것이 꽤 있는 것 같습니다. 모두 다는 모르겠고 서두에 말했던 'arm64-v8a' 에 대한 빌드를 진행 하기 위한 과정을 위해서 고쳐야 할 파일들을 말해 볼께요.
다음을 참고 했습니다.
https://stackoverflow.com/questions/50868753/two-different-ways-to-choose-specific-abi-in-android
아래래 파일에 대한 설정은 저번 글에서 언급 했으니, 그냥 지나가겠습니다.
~\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 가 생성 된 것을 확인 할 수 있습니다.
이상.
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 스튜디오 설치하기 (2) | 2024.08.30 |
---|---|
Apk 크기 간소화 : 안드로이드 앱 크기 줄이기 (0) | 2024.08.29 |
[Android] 안드로이드 용 OpenCV 빌드하기-2 (1) | 2024.01.23 |
[Android] 안드로이드 용 OpenCV 빌드하기 (0) | 2024.01.22 |
[Android] OpenCV, 프로그래머 (1) | 2024.01.19 |