-
[Android] ์๋๋ก์ด๋ ์คํ๋์ค NDK ์ฌ์ฉ๋ฒAndroid 2021. 2. 12. 07:41๋ฐ์ํ
NDK๋?
- ์๋๋ก์ด๋ ์คํ๋์ค์์ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์๋ ๋ค์ดํฐ๋ธ ์ฝ๋(C/C++)๋ฅผ ์ฌ์ฉํด์ผ ํ ๋๊ฐ ์์ต๋๋ค.
- ์๋ฐ ์ด์ธ์ ๋ค์ดํฐ๋ธ ์ฝ๋(C/C++)์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ JNI(Java Native Interface)๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ์์ด์ผ ํฉ๋๋ค.
- NDK(Native Development Kit)๋ ์๋๋ก์ด๋ ํ๊ฒฝ์์ JNI๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ตฌ์ฑ๋ ํคํธ์ ๋๋ค.
NDK ์ค์น
- ์๋๋ก์ด๋ ์คํ๋์ค ์๋จ๋ฐ์ Tools -> SDK Manager๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ์ดํ Android SDK์ SDK Tools์์ NDK๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. Show Package Detail์ ๋๋ฌ ์์ธํ ๋ฒ์ ์ NDK๋ ์ค์น๊ฐ๋ฅํฉ๋๋ค.
NDK ์์น ์ค์
- ์๋๋ก์ด๋ ์๋จ๋ฐ์ File -> Project Structure๋ฅผ ํด๋ฆญํฉ๋๋ค.
- SDK, JDK, NDK ์ค์ ํ๋ ๊ณณ์ด ๋ํ๋๋ฉฐ, ndk-bundle์ด ์๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํฉ๋๋ค. ๋๋ ndk์ ๋ฒ์ ์ ํด๋นํ๋ ํด๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํด๋ ๋ฉ๋๋ค.
- ๊ฐํน ๊ฒฝ๋ก๊ฐ ์ ๋ ฅ์ด ์๋๋๋ฐ ์ด๋ด๊ฒฝ์ฐ Gradle.scripts์ local.properties ํ์ผ๋ก ๊ฐ์ ์ง์ ์์ ํ๋๋ก ํฉ๋๋ค.
Main ์ฝ๋
- System.LoadLibrary ํจ์๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์์ฑ๋ ๋ชจ๋์ ํธ์ถํ๋ ๋ถ๋ถ์ ๋๋ค.
- public native int getSum ๋ฉ์๋๋ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ์์ฑ๋ ๋ฉ์๋์ ๋์ผํ ํํ(๋ฉ์๋๋ช , ๋ฆฌํด ํ์ ) ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
Native ์ฝ๋
JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_getSum(JNIEnv *env, jobject thiz, jint num1, jint num2){ return num1+num2; }
- ๋จผ์ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ๋ชจ์๋์ ํด๋๋ฅผ jni๋ช ์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
- ์ดํ ์ค๋ฅธ์ชฝ ๋ฒํผ์ ๋๋ฌ New -> C/C++ Source File ๋๋ฌ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
- JNIEXPORT <๋ฆฌํดํ์ > JNICALL_Java_<ํจํค์ง๋ช >_<ํด๋์ค๋ช >_<ํจ์๋ช > ํํ๋ก ์์ฑํ๋ ํจํค์ง๋ช ์ .์ _๋ก ๋์ฒดํฉ๋๋ค.
Header ํ์ผ ์์ฑ
- ํค๋ํ์ผ์ ์ง์ ์์ฑํ ์ ์์ง๋ง, ์๋๋ก์ด๋ ์คํ๋์ค๋ฅผ ์ด์ฉํ์ฌ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
Preferences์์ Tools -> External Tools์์ ์๋ก ํ๋ ์ถ๊ฐํ์ฌ ์์ฑํ๋๋ก ํฉ๋๋ค.
- Name : Tool๋ช
- Program : javah ํ์ผ์ด ์๋ ๊ฒฝ๋ก, ๋๋ถ๋ถ jdk์ Content/Home/bin ํด๋ ๋ด๋ถ์ ์กด์ฌํฉ๋๋ค. java8 ๋ฒ์ ์ดํ javah๊ฐ ์์ด์ ธ์ javac๋ก ๋์ฒด๋๋ค๊ณ ํ์ง๋ง ๋ฐฉ๋ฒ์ ๋ชป์ฐพ์์ต๋๋ค. ์ฐพ์ผ์ ๋ถ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํฉ๋๋ค.
ex) /Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/bin/javah - Arguments : ํด๋์ค ํ์ผ ๊ฒฝ๋ก์ ํจํค์ง ๋ด๋ถ ํด๋์ค
ex) -classpath /Users/wonseok/AndroidStudioProjects/JniTest/app/src/main/java -v -jni $FileClass$ - Working directory : header ํ์ผ์ด ์์ฑ๋ ๊ฒฝ๋ก, jni ํด๋ ๊ฒฝ๋ก
ex) /Users/wonseok/AndroidStudioProjects/JniTest/app/src/main/jni
javah๋ฅผ ํด๋ฆญํ๋ฉด ์ด์ ์ ์์ฑํ๋ Calculator.cpp์ ํค๋ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. ํค๋ํ์ผ ๋ช ์ <ํจํค์ง๋ช >_<ํด๋์ค๋ช > ์ผ๋ก ์ง์ ๋๋๋ฐ ์ง์ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. ์ดํ cpp ํ์ผ์ ํค๋ํ์ผ ๋ช ์ include ํด์ผ ํฉ๋๋ค.
#include<com_example_jnitest_MainActivity.h> JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_getSum(JNIEnv *env, jobject thiz, jint num1, jint num2){ return num1+num2; }
Android.mk, Application.mk ํ์ผ ์์ฑ
jni ํด๋์์ Android.mk, Application.mk ํ์ผ์ ์์ฑํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด ๋ฉ๋๋ค. ๊ฐ ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ๊ณต์๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค. Android.mk๋ ๋น๋์์คํ ์ ์์ค ๋ฐ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค๋ช ํ๋ ํ์ผ์ด๊ณ , ์ด ํ์ผ์ ํตํด์ ์์ค์ฝ๋๋ฅผ ๋ชจ๋๋ก ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค. ๋ชจ๋์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์คํ ํ์ผ์ ๋ปํ๊ฒ ๋ฉ๋๋ค.
- LOCAL_PATH : ์์คํ์ผ์ ๊ฒฝ๋ก , my-dir(์์คํ ์ด ์ ๊ณตํ๋ ๋งคํฌ๋ก ํจ์) : Android.mkํ์ผ์ด ํฌํจ๋ ๊ฒฝ๋ก
- CLEAR_VARS : LOCAL_XXX๋ก ๋์ด ์๋ ๋ณ์๋ค์ ์๋์ผ๋ก ์ญ์ ํ๋ ๋ณ์์ ๋๋ค. ๋ชจ๋์ ์ค๋ช ํ๊ธฐ ์ ์ ์ ์ธ๋์ด์ผ ํฉ๋๋ค.
- LOCAL_MODULE : ๋น๋ํ๋ ค๋ ๋ชจ๋์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. System.loadLibrary์์ ์ค์ ํ๋ ๋ชจ๋๋ช ์ ์ ๋ ฅํด์ผ ํฉ๋๋ค.
- LOCAL_SRC_FILES : ๋ชจ๋์ ๋น๋ํ C,C++ ์์คํ์ผ ๋ชฉ๋ก์ ์ ๋ ฅํฉ๋๋ค.
- LOCAL_LDLIBS : ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ ํ์ผ์ ๋น๋ํ ๋ ์ฌ์ฉํ ์ถ๊ฐ ๋ง์ปค ๋ชฉ๋ก์ ๋๋ค. -l ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์๋ log ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- BUILD_SHARED_LIBRARY : LOCAL_XXX๋ณ์์์ ์ ๊ณตํ ๋ชจ๋์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์งํ๋ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋์ดํ ์์ค์์ ํ๊ฒ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค.
Application.mk๋ ndk-build์ ํ๋ก์ ํธ ์ ์ฒด ์ค์ ์ ์ง์ ํฉ๋๋ค. ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ๊ณต์๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
- APP_ABI : ABI์ฉ ์ฝ๋ ์์ฑ
- APP_PLATFORM : ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๋ API ์์ค์ ์ ์ธํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ minSdkVersion์ ๋ปํฉ๋๋ค.
- APP_STL : ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋ C++ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- APP_CPPFLAGS : ๋ชจ๋ C++ ์ปดํ์ผ์ ์ํด ์ ๋ฌ๋๋ ํ๋๊ทธ
- APP_BUILD_SCRIPT : Android.mk ํ์ผ์ ์ ๋๊ฒฝ๋ก, ๊ธฐ๋ณธ๊ฐ์ผ๋ก jni ํด๋ ์๋๋ฅผ ์ฐพ๊ธฐ์ ์ ๊ฒฝ๋ก์ผ ์ ๋ฐ๋ก ์ง์ ์ ์ํด๋ ๋ฌด๋ฐฉ
NDK ๋น๋, ์ ์ฒด ๊ฒฐ๊ณผ
MainActivtiy ํด๋์ค ํ์ผ์ ์ค๋ฅธ์ชฝ ๋ฒํผ์ ํด๋ฆญํ์ฌ Link C++ Project with Gradle ํด๋ฆญํฉ๋๋ค.
์ด ๋ฉ๋ด๊ฐ ์๋ค๋ฉด ์๋จ๋ฐ์ Build -> Refresh Linked C++ Projects๋ฅผ ํด๋ฆญํ๋ฉด ๋ฉ๋๋ค.๋ง์ผ Link C++ Project with Gradle์ด ์๊ณ Refersh Linked C++ Project ๋ฒํผ์ด ํ์ฑํ ๋์ด ์์ง ์์ผ๋ฉด ์๋์ผ๋ก Gradle์ ๊ตฌ์ฑํ์ฌ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ฅด๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
build.gradle(app)์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ฉด ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐ๊ฒฐ๋๊ณ Refresh Linked C++ Project ๋ฒํผ์ ํ์ฑํ๋๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
NDK ๋น๋ ํ Main ์ฝ๋๋ฅผ ์คํํ๋๋ผ๋ ์ค๋ฅ๊ฐ ์์ด ์ ์์ ์ธ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
java ์ฝ๋๋ก ๋ ํผ์ฐ์ฐ์๋ฅผ ๋ํ๋ ๋ฉ์๋๋ ์์ง๋ง ๋ค์ดํฐ๋ธ ์ฝ๋(c/c++)๋ก ์ ์๋ ๋ฉ์๋๋ฅผ ์คํํ์ฌ ์ ์์ ์ผ๋ก ์ถ๋ ฅํ ์ ์์ต๋๋ค.๋ฐ์ํ'Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Robelctric Test๋ (0) 2021.02.17 [Android] Unit Test, JUnit4 (0) 2021.02.16 [Java] ์๋ฐ ์ฐ๋ ๋์ ๋๊ธฐํ (0) 2021.02.07 [Android] Broadcast? Broadcast Receiver๋? (0) 2021.01.08 [Android] Recycler View ์ฌ์ฉ๋ฒ (0) 2021.01.04