Android/Daemon

개발 환경 준비: Android NDK를 이용한 사용자 정의 Android Daemon 구축

임베디드 친구 2025. 6. 14. 20:01
728x90
반응형

개발 환경 준비: Android NDK를 이용한 사용자 정의 Android Daemon 구축

Android NDK를 활용하여 C/C++ 기반의 사용자 정의 Android Daemon을 개발하기 위해서는 먼저 개발 환경을 올바르게 설정해야 합니다. 본 글에서는 Android NDK 설치 및 설정, CMake 및 Gradle 설정 방법, 그리고 Android Studio 및 CLI(Command Line Interface) 빌드 환경 구성 방법을 다룹니다.


1. Android NDK 설치 및 설정

Android NDK(Native Development Kit)는 Android 애플리케이션에서 C 및 C++ 코드를 활용할 수 있도록 지원하는 개발 도구입니다. 사용자 정의 Daemon을 개발하려면 우선 Android NDK를 설치해야 합니다.

1.1 Android NDK 다운로드 및 설치

Android NDK는 Android Studio의 SDK Manager를 통해 설치할 수 있습니다.

  1. Android Studio 실행
  2. [Tools] > [SDK Manager] 이동
  3. [SDK Tools] 탭으로 이동
  4. "NDK (Side by side)" 옵션 체크
  5. "Apply" 버튼 클릭 후 설치 진행

설치가 완료되면, NDK의 설치 경로는 일반적으로 다음과 같습니다:

$ANDROID_SDK/ndk/<version>

만약 CLI를 이용해 설치하고 싶다면, 아래 명령어를 실행하면 됩니다.

sdkmanager --install "ndk;25.1.8937393"

1.2 환경 변수 설정

NDK를 정상적으로 사용하기 위해서는 환경 변수를 설정해야 합니다.

Linux 및 macOS

export ANDROID_NDK_HOME=$ANDROID_SDK/ndk/<version>
export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH

Windows (PowerShell)

$env:ANDROID_NDK_HOME="C:\Path\To\Android\Sdk\ndk\<version>"
$env:Path += ";$env:ANDROID_NDK_HOME\toolchains\llvm\prebuilt\windows-x86_64\bin"

환경 변수를 설정한 후, 터미널에서 다음 명령어를 실행하여 정상적으로 설정되었는지 확인합니다.

clang --version

2. CMake 및 Gradle 설정 방법

Android NDK 프로젝트에서 CMake 및 Gradle을 적절하게 설정하는 것이 중요합니다.

2.1 CMakeLists.txt 설정

NDK를 이용한 프로젝트에서 CMake를 활용하면 C/C++ 코드를 빌드할 수 있습니다. 프로젝트의 CMakeLists.txt 파일을 다음과 같이 설정합니다.

cmake_minimum_required(VERSION 3.10)
project(my_daemon)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_library(
    my_daemon
    SHARED
    src/main/cpp/daemon.cpp
)

find_library(
    log-lib
    log
)

target_link_libraries(
    my_daemon
    ${log-lib}
)

이 설정을 통해 daemon.cpp 파일을 컴파일하고 Android의 로그 라이브러리(log)와 연결합니다.

2.2 Gradle 설정

Gradle 빌드 스크립트에서 NDK 관련 설정을 추가해야 합니다. app/build.gradleandroid 섹션을 수정합니다.

android {
    compileSdkVersion 33
    ndkVersion "25.1.8937393"

    defaultConfig {
        applicationId "com.example.mydaemon"
        minSdkVersion 21
        targetSdkVersion 33
        versionCode 1
        versionName "1.0"

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17 -frtti -fexceptions"
            }
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
            version "3.10.2"
        }
    }
}

이 설정을 통해 Gradle이 CMakeLists.txt를 인식하고, NDK 빌드 시스템과 통합됩니다.


3. Android Studio 및 CLI 빌드 환경 구성

3.1 Android Studio에서 NDK 프로젝트 열기

  1. Android Studio를 실행합니다.
  2. [File] > [New] > [Import Project] 선택합니다.
  3. CMakeLists.txt가 포함된 프로젝트 디렉터리를 선택합니다.
  4. build.gradle을 수정한 후, Sync Now 버튼을 클릭하여 변경 사항을 적용합니다.

3.2 CLI에서 빌드하기

Android Studio 없이 CLI에서 NDK 프로젝트를 빌드하려면, 다음 명령어를 실행합니다.

./gradlew assembleDebug

또는, NDK 빌드 시스템을 직접 활용할 수도 있습니다.

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

빌드가 완료되면, app/build/outputs/apk/debug/ 디렉터리에 apk 파일이 생성됩니다.


4. 간단한 Android Daemon 예제

NDK를 이용하여 Android에서 Daemon을 실행하는 간단한 예제 코드를 작성해 보겠습니다.

4.1 C++ Daemon 코드 (daemon.cpp)

#include <jni.h>
#include <pthread.h>
#include <android/log.h>
#include <unistd.h>

#define LOG_TAG "MyDaemon"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

void* daemon_thread(void* arg) {
    while (true) {
        LOGI("Daemon is running...");
        sleep(5);
    }
    return nullptr;
}

extern "C" JNIEXPORT void JNICALL
Java_com_example_mydaemon_MainActivity_startDaemon(JNIEnv* env, jobject obj) {
    pthread_t daemonThread;
    pthread_create(&daemonThread, nullptr, daemon_thread, nullptr);
}

4.2 Java에서 Daemon 호출 (MainActivity.java)

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("my_daemon");
    }
    private native void startDaemon();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startDaemon();
    }
}

이제 앱을 실행하면 Daemon is running... 로그가 5초마다 출력됩니다.


이 글에서는 Android NDK를 이용해 사용자 정의 Android Daemon을 개발하기 위한 환경 설정과 기본적인 예제 코드를 다뤘습니다.

반응형