Android (안드로이드)

[Android] NDK / JNI (3) - CMake 방식 적용

Oscar:) 2024. 12. 9. 20:00
728x90

 

 

이번 포스팅에서는 CMake 방식을 사용해보려고 한다.

CMake 방식은 Gradle과의 통합이 훨씬 매끄럽고, 빌드 관리가 더 수월하다.

 

지난 포스팅의 Android.mk 파일과 ndk-build를 사용하던 방식보다

CMake 방식이 현시점으로서는 더 표준적인 방식이라고 볼 수 있다.

 

 

 

 

먼저 구조 상 다른 점을 간단히 짚어본다.

 

- [jni] 폴더와 Android.mk, Application.mk 파일은 사용하지 않는다.
- CMakeList.txt 파일이 대체된다.
- Gradle 에 작성할 내용이 약간 변경된다.
- [ndk-build] 등 수동으로 빌드하지 않아도 된다. (Gradle이 자동으로 빌드해줌)

 

 

 

 

이제 직접 적용해보자.

 

 

 


 

 

 

✅ NDK 설치 · 세팅

 

지난 포스팅의 NDK 설치 · 세팅과 모든 과정이 동일하다.

 

 

[Android] NDK / JNI (2) - 적용해보기

이번 포스팅에서는 로컬 환경에 NDK를 설치 · 안드로이드 프로젝트에 세팅하고,JNI를 사용하여 C언어로 작성된 코드를 안드로이드 환경에서 호출해본다.      NDK 설치 · 안드로이드 프로젝트

oscarstory.tistory.com

 

똑같은 과정 설명을 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 포스팅은 여기서 마무리한다.

 

 

 

 

728x90