[Android] Android cross-compile with ndk-build(c)

Android μ—μ„œ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλŠ” λ°”μ΄λ„ˆλ¦¬λ₯Ό μƒμ„±ν•˜λŠ” 방법은 μ—¬λŸ¬κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.
Android 곡식 νŽ˜μ—μ§€μ—μ„œλŠ” ndkλ₯Ό μ΄μš©ν•œ λΉŒλ“œ 방법을 3가지 μ†Œκ°œν•©λ‹ˆλ‹€.

NDK둜 μ½”λ“œλ₯Ό λΉŒλ“œν•˜λŠ” 방법은 크게 μ„Έ 가지가 μžˆμŠ΅λ‹ˆλ‹€.

❗ 개인적으둜 c/c++ μ½”λ“œλ₯Ό λΉŒλ“œν•˜λŠ” 방법쀑 ndk-buildλ₯Ό μ΄μš©ν•œ 방법이 κ°€μž₯ μ‰¬μ›Œλ³΄μ—¬ μ •λ¦¬ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

Android-ndk-build

☝🏻 What is NDK-build

ndk-buildλŠ” ndkλ₯Ό μ΄μš©ν•˜μ—¬ μ•ˆλ“œλ‘œμ΄λ“œλ₯Ό target으둜 λΉŒλ“œλ₯Ό 진행할 수 μžˆλ„λ‘ λ•λŠ” Toolμž…λ‹ˆλ‹€.
μ•ˆλ“œλ‘œμ΄λ“œ κ³΅μ‹νŽ˜μ΄μ§€μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

ndk-buildΒ μŠ€ν¬λ¦½νŠΈλŠ” NDK의 Make 기반 λΉŒλ“œ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œν•©λ‹ˆλ‹€.

즉, ndk-buildλŠ” c/c++ ν”„λ‘œμ νŠΈλ₯Ό μ•ˆλ“œλ‘œμ΄λ“œ μ•± μ œμž‘μ— μ‚¬μš©ν•˜κΈ° μœ„ν•œ λΉŒλ“œ 슀크립트라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.μ΄λŸ¬ν•œ ndk-build μŠ€ν¬λ¦½νŠΈλŠ” ndkλ₯Ό λ‹€μš΄λ°›κ²Œλ˜λ©΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Android-download-ndk

μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ§μ ‘μ μœΌλ‘œ ndk-buildλ₯Ό Make기반이라고 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
μ•„λž˜λŠ” ndk-buildκ°€ 싀행될 λ•Œ μ‹€ν–‰λ˜λŠ” λͺ…λ Ήμ–΄ setμž…λ‹ˆλ‹€.

$GNUMAKE -f <ndk>/build/core/build-local.mk
<parameters>

μ΄λŸ¬ν•œ μ„±μ§ˆλ•Œλ¬Έμ—μΈμ§€ make cleanκ³Ό μœ μ‚¬ν•˜κ²Œ λΉŒλ“œλ₯Ό cleanν•  수 μžˆλŠ” λͺ…령어도 이용이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

ndk-build clean

☝🏻 How to use?

ndk-buildλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ νŒŒμΌμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • jni
  • Android.mk
  • Application.mk

hello.cλ₯Ό μ»΄νŒŒμΌν•˜λŠ” κ³Όμ •μœΌλ‘œ 예λ₯Ό λ“€μ–΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

$ tree .                                                                     ─╯
.
└── jni
    β”œβ”€β”€ Android.mk
    β”œβ”€β”€ Application.mk
    └── hello.c

폴더 ꡬ성을 μœ„μ™€ 같이 jni폴더λ₯Ό μƒμ„±ν•˜κ³ , ν•˜μœ„ 폴더에 λΉŒλ“œν•˜κ³  싢은 μ†ŒμŠ€μ½”λ“œ 파일 , λΉŒλ“œ 속성을 지정할 수 μžˆλŠ” Android.mk, Application.mkλ₯Ό λ§Œλ“€μ–΄μ£Όλ©΄ 기본적인 ν™˜κ²½κ΅¬μ„±μ€ λμž…λ‹ˆλ‹€.

이제 각각을 μ–΄λ–»κ²Œ κ΅¬μ„±ν–ˆλŠ”μ§€ λ³΄κ² μŠ΅λ‹ˆλ‹€.
λ¨Όμ € Android.mkλŠ” λ‹€μŒκ³Ό 같이 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

Android.mk

LOCAL_PATH := $(call my-dir)

LOCAL_MODULE := hello

LOCAL_SRC_FILES := hello.c

include $(BUILD_EXECUTABLE)%

λ‹€μŒμœΌλ‘œ Application.mk μž…λ‹ˆλ‹€.

Application.mk

APP_ABI := armeabi-v7a arm64-v8a x86_64
APP_PLATFORM := android-23
❗ 각각의 속성에 λŒ€ν•΄μ„œλŠ” 좔후에 μ •λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.<br>

이제 λΉŒλ“œλ₯Ό μ§„ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

λΉŒλ“œλŠ” jniκ°€ μ‘΄μž¬ν•˜λŠ” 그리고, Android.mk와 Application.mkκ°€ μ‘΄μž¬ν•˜λŠ” μƒμœ„ν΄λ”μ—μ„œ μ§„ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

ndk-build or /path/to/ndk-build

μœ„μ™€ 같이 ndk-build 슀크립트λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‹€μŒμ˜ κ²°κ³Όλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

[armeabi-v7a] Compile thumb  : hello <= hello.c
[armeabi-v7a] Executable     : hello
[armeabi-v7a] Install        : hello => libs/armeabi-v7a/hello
[arm64-v8a] Compile        : hello <= hello.c
[arm64-v8a] Executable     : hello
[arm64-v8a] Install        : hello => libs/arm64-v8a/hello
[x86_64] Compile        : hello <= hello.c
[x86_64] Executable     : hello
[x86_64] Install        : hello => libs/x86_64/hello

☝🏻 결둠

λΉŒλ“œκ°€ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
이제 λΉŒλ“œκ²°κ³Όλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

❗ λΉŒλ“œλ₯Ό μ§„ν–‰ν•˜λ©΄ `obj` 파일과 `libs` 파일이 μƒμ„±λ©λ‹ˆλ‹€. μ΄λ•Œ, λ°”μ΄λ„ˆλ¦¬ μ‹€ν–‰νŒŒμΌμ˜ 경우 `obj` 폴더 μ•„λž˜ μƒμ„±λ©λ‹ˆλ‹€.

μœ„μ—μ„œ μ§€μ •ν•΄μ€€λŒ€λ‘œ arm64-v8a, armeabi-v7a, x86_64 폴더 μ•„λž˜ λ°”μ΄λ„ˆλ¦¬κ°€ μˆœμ„œλŒ€λ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μœ„μ—μ„œλŠ” cμ½”λ“œλ₯Ό λΉŒλ“œν–ˆμ§€λ§Œ, cppμ½”λ“œλ„ λΉŒλ“œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
ndk-build 슀크립트 μ‹€ν–‰ ν•œλ²ˆμ„ 톡해 μ›ν•˜λŠ” μ•„ν‚€ν…μ²˜μ˜ μ‹€ν–‰νŒŒμΌμ„ 생성할 수 μžˆλ‹€λŠ” 점이 큰 맀λ ₯μž…λ‹ˆλ‹€.

cpp μ½”λ“œ λΉŒλ“œ κ³Όμ •μ˜ κ²½μš°μ—λŠ” μŠ€ν¬κ°€ 될 수 있기 λ•Œλ¬Έμ— λ”°λ‘œ λΈ”λ‘œκ·Έ 링크 μΆ”κ°€ν•©λ‹ˆλ‹€.

μ†ŒμŠ€μ½”λ“œ : github

cpp ex : cpp code

Categories:

Updated:

Leave a comment