Android
Android NDK
수색…
Android 용 기본 실행 파일 만들기
project / jni / main.c
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("Hello world!\n");
return 0;
}
project / jni / Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)
프로젝트 / jni / Application.mk
APP_ABI := all
APP_PLATFORM := android-21
5.0보다 낮은 Android 버전 (API 21)을 실행하는 기기를 지원하려면 APP_PLATFORM
을 이전 API (예 : android-8
설정하여 이진 파일을 컴파일해야합니다. 이것은 안드로이드 5.0이 PIE ( Position Independent Binaries)를 시행 한 결과 인 반면 구형 디바이스는 반드시 PIE를 지원하지 않습니다. 따라서 장치 버전에 따라 PIE 또는 비 PIE 중 하나를 사용해야합니다. Android 애플리케이션에서 바이너리를 사용하려면 API 레벨을 확인하고 올바른 바이너리를 추출해야합니다.
APP_ABI
는 armeabi
와 같은 특정 플랫폼으로 변경하여 해당 아키텍처의 바이너리 만 빌드 할 수 있습니다.
최악의 경우, 각 아키텍처 (ndk-r10e를 사용하는 약 14 개의 서로 다른 바이너리)에 대해 PIE 및 비 PIE 바이너리를 모두 갖게됩니다.
실행 파일을 빌드하려면 다음을 수행하십시오.
cd project
ndk-build
바이너리는 project/libs/<architecture>/hello_world
에서 찾을 수 있습니다. ADB
(실행 권한으로 push
및 chmod
) 또는 응용 프로그램 (실행 권한으로 추출 및 chmod
)에서 사용할 수 있습니다.
CPU의 구조를 확인하려면 빌드 속성 검색 ro.product.cpu.abi
기본 구조 나에 대한 ro.product.cpu.abilist
지원 아키텍처의 전체 목록 (새로운 장치를). 응용 프로그램 내에서 android.os.Build
클래스를 사용하거나 ADB를 통해 getprop <name>
을 사용하여이 작업을 수행 할 수 있습니다.
빌드를 정리하는 방법
빌드를 정리해야하는 경우 :
ndk-build clean
Android.mk 이외의 메이크 파일을 사용하는 방법
ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk
ndk에 로그인하는 방법
먼저 Android.mk
파일의 로깅 라이브러리에 링크해야합니다.
LOCAL_LDLIBS := -llog
그런 다음 __android_log_print()
호출 중 하나를 사용하십시오.
#include <android/log.h>
#define TAG "MY LOG"
__android_log_print(ANDROID_LOG_VERBOSE, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_WARN, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_DEBUG, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_INFO, TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_ERROR, TAG, "The value of 1 + 1 is %d", 1 + 1)
또는 해당 매크로를 정의하여보다 편리하게 사용할 수 있습니다.
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
예 :
int x = 42;
LOGD("The value of x is %d", x);