{"id":466,"date":"2013-01-17T16:29:46","date_gmt":"2013-01-17T07:29:46","guid":{"rendered":"http:\/\/litcoder.cafe24.com\/?p=466"},"modified":"2013-01-17T16:29:46","modified_gmt":"2013-01-17T07:29:46","slug":"ndk-build-architecture-%eb%b3%80%ea%b2%bd%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=466","title":{"rendered":"Android NDK build architecture \ubcc0\uacbd\ud558\uae30"},"content":{"rendered":"<p>\uc544\ubb34 \uc124\uc815 \uc5c6\uc774 ndk\ub97c build \ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 arm\uc6a9 library\uac00 \ub9cc\ub4e4\uc5b4\uc9c4\ub2e4.<\/p>\n<pre class=\"theme:classic lang:default highlight:0 decode:true\">$ &lt;NDK_PATH&gt;\/ndk-build \nGdbserver      : [arm-linux-androideabi-4.6] libs\/armeabi\/gdbserver\nGdbsetup       : libs\/armeabi\/gdb.setup\nCompile thumb  : hello-jni &lt;= hello-jni.c\nSharedLibrary  : libhello-jni.so\nInstall        : libhello-jni.so =&gt; libs\/armeabi\/libhello-jni.so<\/pre>\n<pre class=\"theme:classic lang:default highlight:0 decode:true\">$ file obj\/local\/armeabi\/libhello-jni.so \nobj\/local\/armeabi\/libhello-jni.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped<\/pre>\n<p>NDK\uc5d0\uc11c build\ub418\ub294 binary\uc758 architecture\ub97c \ubcc0\uacbd\ud558\ub824\uba74 APP_ABI\ub97c \uc120\uc5b8\ud574 \uc8fc\uc5b4\uc57c \ud558\ub294\ub370, Android.mk\uc5d0 \ucd94\uac00\ud574\uc11c\ub294 \uc81c\ub300\ub85c \ub3d9\uc791\ud558\uc9c0 \uc54a\ub294\ub2e4. JNI directory \uc544\ub798\uc5d0 Application.mk file\uc744 \ub9cc\ub4e4\uace0 \u00a0APP_ABI\uac12\uc5d0 build\ud560 architecture\ub97c \uc124\uc815\ud574 \uc900\ub2e4. \ub2e4\uc74c\uc740\u00a0x86 \ubc14\uc774\ub108\ub9ac\ub97c \uc0dd\uc131\ud558\ub294 \uc608\uc81c\uc774\ub2e4.<\/p>\n<pre class=\"theme:classic lang:default highlight:0 decode:true\">$ cat jni\/Application.mk \nAPP_ABI := x86<\/pre>\n<pre class=\"theme:classic lang:default highlight:0 decode:true\">$ &lt;NDK_PATH&gt;\/ndk-build \nGdbserver      : [x86-4.6] libs\/x86\/gdbserver\nGdbsetup       : libs\/x86\/gdb.setup\nCompile x86    : hello-jni &lt;= hello-jni.c\nSharedLibrary  : libhello-jni.so\nInstall        : libhello-jni.so =&gt; libs\/x86\/libhello-jni.so<\/pre>\n<pre class=\"theme:classic lang:default highlight:0 decode:true\">$ file obj\/local\/x86\/libhello-jni.so \nobj\/local\/x86\/libhello-jni.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped<\/pre>\n<p>*\u00a0Build\uc5d0 \uc0ac\uc6a9\ub418\ub294 toolchain\uc740 &lt;NDK_PATH&gt;\/toolchains\/&lt;architecture&gt;-&lt;version&gt;\uc758 \ud615\ud0dc\ub85c \uc704\uce58\ud55c\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc544\ubb34 \uc124\uc815 \uc5c6\uc774 ndk\ub97c build \ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 arm\uc6a9 library\uac00 \ub9cc\ub4e4\uc5b4\uc9c4\ub2e4. $ &lt;NDK_PATH&gt;\/ndk-build Gdbserver : [arm-linux-androideabi-4.6] libs\/armeabi\/gdbserver Gdbsetup : libs\/armeabi\/gdb.setup Compile thumb : hello-jni &lt;= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so =&gt; libs\/armeabi\/libhello-jni.so $ file obj\/local\/armeabi\/libhello-jni.so obj\/local\/armeabi\/libhello-jni.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped NDK\uc5d0\uc11c build\ub418\ub294 binary\uc758 architecture\ub97c [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2],"tags":[11,88,125,159],"class_list":["post-466","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-ndk","tag-tip","tag-x86"],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1489,"url":"https:\/\/litcoder.com\/?p=1489","url_meta":{"origin":466,"position":0},"title":"Android Studio\uc5d0\uc11c Googletest \uc0ac\uc6a9\uc744 \uc704\ud55c \uc124\uc815","author":"litcoder","date":"2016\ub144 7\uc6d4 1\uc77c","format":false,"excerpt":"Android Studio\ub294 \ub0b4 PC\uc5d0\uc11c \uc880 \ub290\ub9ac\uae34 \ud558\uc9c0\ub9cc, \ub2e4\ub978 IDE\ub4e4\uc5d0 \ube44\ud574\uc11c\ub294 Emacs key binding\uc774 \ube44\uad50\uc801 \uc798\ub418\uc5b4 \uc788\uc5b4\uc11c \ub9cc\uc871 \ud558\uba74\uc11c \uc870\uae08\uc529 \ubc30\uc6cc\uac00\uace0 \uc788\ub2e4. NDK\ub85c JNI\uc5d0\uc11c \ubd88\ub7ec\ub2e4 \uc4f8 native code\ub97c \uad6c\ud604\ud558\ub2e4 \ubcf4\ub2c8 Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \ub9e4\ubc88 device\ub85c push \ud558\uace0 \uc2e4\ud589\ud558\ub294 \uacfc\uc815\uc774 \uaf64\ub098 \ubc88\uac70\ub85c\uc640\uc11c script\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Android Studio\uc5d0\uc11c Googletest\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2016\/07\/androidstudio_edittool.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1021,"url":"https:\/\/litcoder.com\/?p=1021","url_meta":{"origin":466,"position":1},"title":"Emacs\uc5d0\uc11c Android \uac1c\ubc1c \ud658\uacbd \uc0ac\uc6a9","author":"litcoder","date":"2014\ub144 8\uc6d4 10\uc77c","format":false,"excerpt":"AOSP\uc5d0\ub294 Emacs\uc5d0\uc11c Android \uac1c\ubc1c\ud658\uacbd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uba87\uba87 el file\ub4e4\uc744 \uc81c\uacf5\ud558\ub294\ub370, platform \u00a0module build\ub97c \uc8fc\ub85c \ud558\uac8c \ub418\ub294 \ub098\ub85c\uc368\ub294 \uc0ac\uc6a9\uc5d0 \ubd80\uc871\ud568\uc774 \uc5c6\ub294 \uac83 \uac19\ub2e4. Module build\uc640 \uae30\ubcf8\uc801\uc778 ADB \uc870\uc791\uc744 \uc9c0\uc6d0\ud558\ub294 \uc774 script\ub4e4\uc758 \uae30\ub2a5\uc774 \ubd80\uc871\ud558\ub2e4\uace0 \ub290\ub080\ub2e4\uba74 Android \uac1c\ubc1c\ud658\uacbd\uc744 \ubcf4\ub2e4 \uc801\uadf9\uc801\uc73c\ub85c \uc9c0\uc6d0\ud558\ub294\u00a0android-mode\uc640 \uac19\uc740 project\ub97c \uace0\ub824\ud574 \ubcf4\ub294\uac83\ub3c4 \uc88b\uc744 \uac83\uc774\ub2e4. buildspec.mk \uc124\uc815 \uc0ac\uc2e4 \uc774 \uae30\ub2a5\uc740\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1475,"url":"https:\/\/litcoder.com\/?p=1475","url_meta":{"origin":466,"position":2},"title":"Android recovery image \ube4c\ub4dc \uc124\uc815","author":"litcoder","date":"2022\ub144 3\uc6d4 5\uc77c","format":false,"excerpt":"1. BoardConfig.mk \uc218\uc815 TARGET_NO_KERNEL\uacfc TARGET_NO_RECOVERY\uac00 true\ub85c \uc124\uc815\ub418\uc5b4 \uc788\ub2e4\uba74 \uc124\uc815\ud55c\ub2e4. 2. device.mk \uc218\uc815 TARGET_PREBUILT_KERNEL\uad00\ub828 \uc124\uc815\uc744 \uc0ad\uc81c\ud55c\ub2e4. 3. AndroidBoard.mk \ucd94\uac00 Kernel build \ub420 \ub54c \ucc38\uace0\ub418\ub294 \ud30c\uc77c\uc774\ubbc0\ub85c \ucd94\uac00\ud574 \uc8fc\uace0 KERNEL_DEFCONFIG\ub4f1\uc758 \uc124\uc815\uc744 \uc790\uc2e0\uc5d0 \ub9de\uac8c \ubcc0\uacbd\ud574 \uc900\ub2e4. 4. AndroidKernel.mk \ucd94\uac00 AndroidKernel.mk\ub294 kernel build\ub97c \uc704\ud55c makefile script\uc774\ub2e4. 5. defconfig file \uacbd\ub85c\ubcc0\uacbd defconfig file\uc774 \ucc38\uc870\ub420 \uc218 \uc788\ub3c4\ub85d\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3104,"url":"https:\/\/litcoder.com\/?p=3104","url_meta":{"origin":466,"position":3},"title":"macOS\uc5d0\uc11c numpy \uc124\uce58\ud560 \ub54c \ube4c\ub4dc \uc2e4\ud328 \ubb38\uc81c","author":"litcoder","date":"2022\ub144 6\uc6d4 6\uc77c","format":false,"excerpt":"Intel Mac\uc5d0\uc11c pip\ub85c numpy(ver1.22)\ub97c \uc124\uce58\ud558\ub824\uace0 \ud588\ub354\ub2c8 \uc124\uce58\uc5d0 \uc2e4\ud328\ud558\uba74\uc11c \uc544\uc8fc \uc544\uc8fc \uae34 \uc624\ub958\uac00 \ub098\uc624\ub294\ub370 Clang compiler option\uc758 architecture flag\uac00 \uc880 \uc774\uc0c1\ud558\ub2e4. % python3 -m pip install numpy ... clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -iwithsysroot\/System\/Library\/Frameworks\/System.framework\/PrivateHeaders -iwithsysroot\/Applications\/Xcode.app\/Contents\/Developer\/Library\/Frameworks\/Python3.framework\/Versions\/3.8\/Headers -arch arm64 -arch x86_64 ... clang: error: the clang compiler\u2026","rel":"","context":"&quot;Tools &amp; Tips&quot;\uc5d0\uc11c","block_context":{"text":"Tools &amp; Tips","link":"https:\/\/litcoder.com\/?cat=6"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":40,"url":"https:\/\/litcoder.com\/?p=40","url_meta":{"origin":466,"position":4},"title":"CTS \uc124\uc815\ud558\uae30","author":"litcoder","date":"2012\ub144 6\uc6d4 4\uc77c","format":false,"excerpt":"\ub2e4\uc74c\uc740 Android CTS \uc2dc\ud5d8\uc744 \uc704\ud55c \ud658\uacbd \uc124\uc815 \uc808\ucc28\uc774\ub2e4. Android gingerbread \ubd80\ud130\ub294 build\ub97c \uc704\ud574\uc11c\ub294 64bits \ud658\uacbd\uc744 \u00a0\uc694\uad6c \ud558\uc9c0\ub9cc CTS\uc6a9\uc73c\ub85c \uc0ac\uc6a9\ud558\ub824\uba74 32bits\ub9cc \uc9c0\uc6d0\ud558\ub294 machine\uc5d0\uc11c\ub3c4 \uac00\ub2a5\ud558\ub2e4. \u00a0 1. \ud544\uc694\ud55c package\ub4e4\uc744 \uc124\uce58 \u00a0(Java6\/zip\/unzip) : 32 bits ubuntu 10.04\ub97c \uae54\uace0 jav6\/zip\/unzip\uc744 \uc124\uce58\ud574 \uc900\ub2e4. \u00a0\ucd5c\uadfc\uc5d0 java6\uac00 \ubcf4\uc548 \ubb38\uc81c\ub85c repository\uc5d0\uc11c \ube60\uc84c\ub294\ub370, \ub2e4\uc74c\uc758 \ubc29\ubc95\uc73c\ub85c \uc124\uce58\ud560 \uc218 \uc788\ub2e4. *\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3322,"url":"https:\/\/litcoder.com\/?p=3322","url_meta":{"origin":466,"position":5},"title":"GitHub release\uc5d0 \ubc14\uc774\ub108\ub9ac \ucca8\ubd80 \uc790\ub3d9\ud654","author":"litcoder","date":"2024\ub144 1\uc6d4 1\uc77c","format":false,"excerpt":"GitHub\uc5d0\uc11c release\ub97c \uc0dd\uc131\ud558\uba74 source code\uc758 snapshot\uc774 zip\uacfc tar.gz\ub85c \uc800\uc7a5\ub41c\ub2e4. \uc5ec\uae30\uc5d0 \ucd94\uac00\ud574\uc11c \ucef4\ud30c\uc77c\ub41c \uacb0\uacfc\uac00 \uc790\ub3d9\uc73c\ub85c \ucd94\uac00\ud558\ub3c4\ub85d \ud55c\ub2e4\uba74, \uac04\ub2e8\ud788 source code\uc640 \uc5f0\uacc4\ub41c \ubc14\uc774\ub108\ub9ac\ub3c4 \ud568\uaed8 \ubc30\ud3ec\ud560 \uc218 \uc788\uc744 \uac83\uc774\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc548\ub4dc\ub85c\uc774\ub4dc \ud504\ub85c\uc81d\ud2b8\ub97c \uac00\uc815\ud574\uc11c release\ub97c \uc0dd\uc131\ud560 \ub54c \uc548\ub4dc\ub85c\uc774\ub4dc APK\ub97c \ube4c\ub4dc\ud558\uace0 source code\uc640 \ud568\uaed8 \ubc30\ud3ec\ud558\ub294 \uac04\ub2e8\ud55c workflow\ub97c \uc124\uba85\ud55c\ub2e4. \uc804\uccb4 \ucf54\ub4dc Event trigger on: release:\u2026","rel":"","context":"&quot;Android&quot;\uc5d0\uc11c","block_context":{"text":"Android","link":"https:\/\/litcoder.com\/?cat=2"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/litcoder.com\/wp-content\/uploads\/2024\/01\/github_workflow_release_attached-e1704114929383.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=466"}],"version-history":[{"count":0,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/466\/revisions"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}