이번 포스팅에서는 CMake 방식을 사용해보려고 한다.
CMake 방식은 Gradle과의 통합이 훨씬 매끄럽고, 빌드 관리가 더 수월하다.
지난 포스팅의 Android.mk 파일과 ndk-build를 사용하던 방식보다
CMake 방식이 현시점으로서는 더 표준적인 방식이라고 볼 수 있다.
먼저 구조 상 다른 점을 간단히 짚어본다.
- [jni] 폴더와 Android.mk, Application.mk 파일은 사용하지 않는다.
- CMakeList.txt 파일이 대체된다.
- Gradle 에 작성할 내용이 약간 변경된다.
- [ndk-build] 등 수동으로 빌드하지 않아도 된다. (Gradle이 자동으로 빌드해줌)
이제 직접 적용해보자.
✅ NDK 설치 · 세팅
지난 포스팅의 NDK 설치 · 세팅과 모든 과정이 동일하다.
똑같은 과정 설명을 2번 할 수는 없으니,
NDK 세팅이 안되있다면 보고 오기 바란다.
✅ Kotlin 파일 세팅
마찬가지로, 지난 포스팅의 Kotlin 파일 세팅과 동일하다.
class MainActivity {
// 네이티브 함수
external fun getNativeTestText(): String
override fun onCreate() {
...
// 네이티브 라이브러리 로드
System.loadLibrary("nativetest-lib")
// 문자열 반환하는 네이티브 함수 호출하여 TextView에 세팅
bind.textview.text = getNativeTestText()
}
}
간단하게 주석을 작성했으니 읽어보면 이해하기 어렵지 않다.
✅ cpp 폴더 생성
[main] 폴더 하위에 [cpp] 폴더를 생성해 주자.
그리고 다음과 같이 2개의 파일을 생성해준다.
- nativetest-lib.c
- CMakeLists.txt
C 파일은 직접 만들어줘야 하지만,
CMakeLists.txt 파일은 전용 파일 생성 탭이 존재한다.
위 처럼 cpp 폴더를 우클릭하면 찾을 수 있다.
● nativetest-lib.c
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_testapp_MainActivity_getNativeTestText(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "CMake 방식으로 네이티브 코드 적용");
}
간단히 문자열을 반환하는 함수 하나를 작성해준다.
마찬가지로 지난 포스팅과 동일한 파일이니, 문법적 설명은 생략한다.
● CMakeLists.txt
# 최소 CMake 버전 지정
cmake_minimum_required(VERSION 3.4.1)
# 라이브러리 추가
add_library(
nativetest-lib # 생성될 라이브러리 이름
SHARED # 공유 라이브러리 지정(.so 파일)
nativetest-lib.c # 소스 파일
)
한 줄마다 주석을 작성했으니 읽어보면 이해가 어렵지 않을 것이다.
기존 방식의 Android.mk 파일의 내용이 이 곳에 작성된다고 생각하면 된다.
✅ Gradle 세팅
build.gradle.kts
android {
...
defaultConfig {
...
ndkVersion = "28.0.12674087"
ndk {
abiFilters.apply {
add("armeabi-v7a")
add("arm64-v8a")
...
}
}
}
externalNativeBuild {
cmake {
path("src/main/cpp/CMakeLists.txt")
}
}
}
abiFilters 를 지정해주는 부분은, 기존 방식에서의 Application.mk 파일에 정의하던
ABI 관련 내용을 이 곳에 작성한다고 이해할 수 있다.
그리고 지난 포스팅에서 Android.mk 파일의 경로를 작성해줬던 것처럼,
이번에는 CMakeLists.txt 파일의 경로를 externalNativeBuild에 작성해준다.
✅ 결과
별도로 빌드할 필요 없이, Run을 통해 앱을 실행하기만 하면 된다.
C 파일에 작성한 문자열이 잘 출력되는 것을 확인할 수 있다.
확실히 ndk-build를 사용하던 옛날 방식보다
CMake 방식이 훨씬 간편했다.
관리하는 파일의 개수를 떠나서, 수동으로 빌드해줘야 했던 방식을
Gradle이 대신 해준다는 것이 제일 크다고 느낀다.
3편에 걸친 NDK · JNI 포스팅은 여기서 마무리한다.
'Android (안드로이드)' 카테고리의 다른 글
[Android] Android Version 종류 및 점유율 확인 / API LEVEL / Target SDK (1) | 2024.12.11 |
---|---|
[Android] 안드로이드 스튜디오 단축키 정리 (Windows) / + 소소한 크롬 단축키 정리 (4) | 2024.12.10 |
[Android] NDK / JNI (2) - 적용해보기 (2) | 2024.12.06 |
[Android] NDK / JNI (1) (2) | 2024.12.04 |
[Android] 안드로이드 환경에서 C언어 사용 이유? / Java · C 성능 차이점 (5) | 2024.12.02 |