솔루션 1로 프로젝트 목적을 달성했지만 통신 방법 특성상 많은 지연 시간이 발생
따라서, 통신부를 제거하고 안드로이드 내부에서 구현하기로 결정
안드로이드 내부에서 카메라를 사용하기 위하여 Java에서 openCV를 구현하는 방법을 탐색
Java에서 openCV 라이브러리를 이용하는 방법은 두 가지가 있다. 하나는 openCV에서 자바로 바인딩해준 라이브러리를 쓰는 방법과 네이티브 코드(C/C++)로 작성된 openCV를 끌어다 쓰는 방법
우리 팀은 후자를 선택했다.
네이티브 코드에서 OpenCV 라이브러리를 사용하는 경우에는 C/C++로 코드를 작성하고, 컴파일하여 머신 코드로 변환한다. 이 때 머신 코드는 하드웨어에 직접 실행되기 때문에 네이티브 코드는 일반적으로 자바 코드보다 빠르다.
따라서, 효율성 측면에서 native code로 openCV를 사용했고 이를 위하여 NDK & JNI를 이용했다.
openCV를 활용하여 테스트 해본 장면
안드로이드 스튜디오에서 JNI를 사용하기 위해서는 다음과 같은 과정이 필요합니다.
네이티브 코드 작성
app/src/main/jni
디렉토리를 생성하여 소스코드를 저장합니다.Android.mk 파일 작성
Application.mk 파일 작성
라이브러리 파일(.so) 생성
JNI 코드 작성
네이티브 메서드 호출
안드로이드 스튜디오에서 JNI를 사용하기 위해서는 ndk-build 툴을 설치하고, Android.mk 및 Application.mk 파일을 작성해야 합니다. 이를 통해 네이티브 코드를 컴파일하고, 라이브러리 파일을 생성할 수 있으며, 자바 코드에서 JNI 함수를 사용하여 네이티브 코드를 호출할 수 있습니다.
최근 안드로이드 스튜디오는 CMake를 사용하여 JNI 코드를 작성하는 방법을 제공하고 있습니다. CMake를 사용하면 ndk-build보다 더 간편하고 유연하게 JNI 코드를 작성할 수 있습니다.
CMake를 사용하여 안드로이드 스튜디오에서 JNI 코드를 작성하는 방법은 다음과 같습니다.
CMakeLists.txt 파일 작성
app/src/main/cpp
디렉토리에 CMakeLists.txt 파일을 작성합니다.C++ 소스코드 작성
app/src/main/cpp
디렉토리에 저장합니다.자바 코드 작성
CMake 프로젝트 빌드
안드로이드 스튜디오에서 CMake를 사용하여 JNI 코드를 작성하는 방법은 ndk-build와 달리 안드로이드 스튜디오에서 지원하는 빌드 시스템 중 하나이므로 더욱 쉽고 간편합니다. 이 방법을 사용하면 CMakeLists.txt 파일을 작성하여 빌드 시스템을 구성하고, C++로 구현한 JNI 메서드를 쉽게 사용할 수 있습니다.
결론적으로 말하면 CMake가 훨씬 작성하기 간결하다.
ndk-build는 Android.mk, Application.mk, 라이브러리 파일을 작성해주어야 하는데 CMake는 CMakeLists.txt 파일 하나만 작성해주면 되기 때문이다.
👆🏻 openCV 라이브러리를 CMakeLists.txt 파일에 작성한 화면
사용자 화면을 굳이 보여줄 필요가 없기 때문에 setVisibility 메서드의 옵션을 INVISIBLE로 부여함. (카메라 백그라운드 실행)
미디어파이프에서 카메라 입력 라이브러리를 지원해주는 사실을 모르고 OpenCV를 이용했었다.
OpenCV는 미디어파이프와 병합 과정에서 충돌도 발생하고 미디어파이프에서 이미 카메라 입력을 지원해주는데 굳이 OpenCV를 고집할 필요가 없어서
import com.google.mediapipe.solutioncore.CameraInput
CameraInput 메서드를 사용해 카메라 입력을 받았다.