ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.