{"id":2376,"date":"2018-02-05T11:07:57","date_gmt":"2018-02-05T03:07:57","guid":{"rendered":"http:\/\/learn-house.idv.tw\/?p=2376"},"modified":"2018-02-05T11:15:20","modified_gmt":"2018-02-05T03:15:20","slug":"%e8%bd%89android-mk%e7%9a%84%e7%94%a8%e6%b3%95%e5%92%8c%e5%9f%ba%e7%a4%8e","status":"publish","type":"post","link":"https:\/\/learn-house.idv.tw\/?p=2376","title":{"rendered":"[\u8f49]Android.mk\u7684\u7528\u6cd5\u548c\u57fa\u790e"},"content":{"rendered":"<p>\u4f86\u6e90\uff1ahttps:\/\/itw01.com\/FGD5EYV.html<\/p>\n<p>\u4e00\u500bAndroid.mk file\u7528\u4f86\u5411\u7de8\u8b6f\u7cfb\u7d71\u63cf\u8ff0\u4f60\u7684\u539f\u59cb\u78bc\u3002\u5177\u9ad4\u4f86\u8aaa\uff1a\u8a72\u6a94\u6848\u662fGNU Makefile\u7684\u4e00\u5c0f\u90e8\u5206\uff0c\u6703\u88ab\u7de8\u8b6f\u7cfb\u7d71\u89e3\u6790\u4e00\u6b21\u6216\u591a\u6b21\u3002\u4f60\u53ef\u4ee5\u5728\u6bcf\u4e00\u500bAndroid.mk file\u4e2d\u5b9a\u7fa9\u4e00\u500b\u6216\u591a\u500b\u6a21\u7d44\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5e7e\u500b\u6a21\u7d44\u4e2d\u4f7f\u7528\u540c\u4e00\u500b\u539f\u59cb\u78bc\u6a94\u6848\u3002\u6bcf\u500b\u6a21\u7d44\u5c6c\u4e0b\u5217\u578b\u5225\u4e4b\u4e00\uff1a 1\uff09APK\u7a0b\u5f0f\uff0c\u4e00\u822c\u7684Android\u7a0b\u5f0f\uff0c\u7de8\u8b6f\u6253\u5305\u751f\u6210apk\u6a94\u6848 2\uff09JAVA\u5eab\uff0cjava\u985e\u5eab\uff0c\u7de8\u8b6f\u6253\u5305\u751f\u6210jar\u6a94\u6848 3) CC++\u61c9\u7528\u7a0b\u5f0f\uff0c\u53ef\u57f7\u884c\u7684CC++\u61c9\u7528\u7a0b\u5f0f 4\uff09CC++\u975c\u614b\u5eab\uff0c\u7de8\u8b6f\u751f\u6210CC++\u975c\u614b\u5eab\uff0c\u4e26\u6253\u5305\u6210.a\u6a94\u6848 5\uff09CC++\u5171\u4eab\u5eab\uff0c \u7de8\u8b6f\u751f\u6210\u5171\u4eab\u5eab\uff08\u52d5\u614b\u9023\u7d50\u5eab\uff09\uff0c\u4e26\u6253\u5305\u6210.so\uff0c \u6709\u4e14\u53ea\u6709\u5171\u4eab\u5eab\u624d\u80fd\u88ab\u5b89\u88dd\/\u8907\u88fd\u5230\u60a8\u7684\u61c9\u7528\u8edf\u9ad4\uff08APK\uff09\u5305\u4e2d\u3002<br \/>\n<!--more--><br \/>\n\uff081\uff09\u5148\u770b\u4e00\u500b\u7c21\u55ae\u7684\u4f8b\u5b50\uff1a\u4e00\u500b\u7c21\u55ae\u7684&#8221;hello world&#8221;\uff0c\u6bd4\u5982\u4e0b\u9762\u7684\u6a94\u6848\uff1a<br \/>\nsources\/helloworld\/helloworld.c<br \/>\nsources\/helloworld\/Android.mk<br \/>\n\u76f8\u61c9\u7684Android.mk\u6a94\u6848\u6703\u50cf\u4e0b\u9762\u9019\u6a23\uff1a<\/p>\n<p>LOCAL_PATH := $(call my-dir)<br \/>\ninclude $(CLEAR_VARS)<br \/>\nLOCAL_MODULE   := helloworld<br \/>\nLOCAL_SRC_FILES := helloworld.c<br \/>\ninclude $(BUILD_SHARED_LIBRARY)<\/p>\n<p>\u6211\u5011\u4f86\u89e3\u91cb\u4e00\u4e0b\u9019\u5e7e\u884c\u7a0b\u5f0f\u78bc\uff1a<br \/>\n1\uff0cLOCAL_PATH := $(call my-dir) \uff0c\u4e00\u500bAndroid.mk file\u9996\u5148\u5fc5\u9808\u5b9a\u7fa9\u597dLOCAL_PATH\u8b8a\u6578\u3002\u5b83\u7528\u65bc\u5728\u958b\u767c\u6a39\u4e2d\u67e5\u8a62\u539f\u59cb\u6a94\u3002\u5728\u9019\u500b\u4f8b\u5b50\u4e2d\uff0c\u5de8\u96c6\u51fd\u5f0f\u2018my-dir\u2019, \u7531\u7de8\u8b6f\u7cfb\u7d71\u63d0\u4f9b\uff0c\u7528\u65bc\u8fd4\u56de\u7576\u524d\u8def\u5f91\uff08\u5373\u5305\u542bAndroid.mk file\u6a94\u6848\u7684\u76ee\u9304\uff09\u3002<br \/>\n2\uff0cinclude $( CLEAR_VARS)\uff0cCLEAR_VARS\u7531\u7de8\u8b6f\u7cfb\u7d71\u63d0\u4f9b\uff08(\u53ef\u4ee5\u5728 android \u5b89\u88dd\u76ee\u9304\u4e0b\u7684\/build\/core\/config.mk \u6a94\u6848\u770b\u5230\u5176\u5b9a\u7fa9\uff0c\u70ba CLEAR_VARS:= $(BUILD_SYSTEM)\/clear_vars.mk)\uff09\uff0c\u6307\u5b9a\u8b93GNU MAKEFILE\u70ba\u4f60\u6e05\u9664\u8a31\u591aLOCAL_XXX\u8b8a\u6578\uff08\u4f8b\u5982 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, \u7b49\u7b49&#8230;),\u9664LOCAL_PATH \u3002\u9019\u662f\u5fc5\u8981\u7684\uff0c\u56e0\u70ba\u6240\u6709\u7684\u7de8\u8b6f\u63a7\u5236\u6a94\u6848\u90fd\u5728\u540c\u4e00\u500bGNU MAKE\u57f7\u884c\u74b0\u5883\u4e2d\uff0c\u6240\u6709\u7684\u8b8a\u6578\u90fd\u662f\u5168\u57df\u6027\u7684\u3002<br \/>\n3\uff0cLOCAL_MODULE := helloworld\uff0cLOCAL_MODULE\u8b8a\u6578\u5fc5\u9808\u5b9a\u7fa9\uff0c\u4ee5\u6a19\u8b58\u4f60\u5728Android.mk\u6a94\u6848\u4e2d\u63cf\u8ff0\u7684\u6bcf\u500b\u6a21\u7d44\u3002\u540d\u7a31\u5fc5\u9808\u662f\u552f\u4e00\u7684\uff0c\u800c\u4e14\u4e0d\u5305\u542b\u4efb\u4f55\u7a7a\u683c\u3002\u6ce8\u610f\u7de8\u8b6f\u7cfb\u7d71\u6703\u81ea\u52d5\u7522\u751f\u5408\u9069\u7684\u5b57\u9996\u548c\u5b57\u5c3e\uff0c\u63db\u53e5\u8a71\u8aaa\uff0c\u4e00\u500b\u88ab\u547d\u540d\u70ba&#8217;foo&#8217;\u7684\u5171\u4eab\u5eab\u6a21\u7d44\uff0c\u5c07\u6703\u751f\u6210&#8217;libfoo.so&#8217;\u6a94\u6848\uff08\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5df2libxxx\u547d\u540d\u597d\uff09\u3002<br \/>\n4\uff0cLOCAL_SRC_FILES := helloworld.c\uff0cLOCAL_SRC_FILES\u8b8a\u6578\u5fc5\u9808\u5305\u542b\u5c07\u8981\u7de8\u8b6f\u6253\u5305\u9032\u6a21\u7d44\u4e2d\u7684C\u6216C++\u539f\u59cb\u78bc\u6a94\u6848\u3002\u6ce8\u610f\uff0c\u4f60\u4e0d\u7528\u5728\u9019\u88cf\u5217\u51fa\u6a19\u982d\u6a94\u6848\u548c\u5305\u542b\u6a94\u6848\uff0c\u56e0\u70ba\u7de8\u8b6f\u7cfb\u7d71\u5c07\u6703\u81ea\u52d5\u70ba\u4f60\u627e\u51fa\u4f9d\u8cf4\u578b\u7684\u6a94\u6848\uff1b\u50c5\u50c5\u5217\u51fa\u76f4\u63a5\u50b3\u905e\u7d66\u7de8\u8b6f\u5668\u7684\u539f\u59cb\u78bc\u6a94\u6848\u5c31\u597d\u3002       <\/p>\n<p>\u6b64\u8655\u96d6\u6c92\u7528\u5230\u5176\u4ed6\u5e38\u7528\u7684\u9084\u6709\uff1a<br \/>\n5\uff0cLOCAL_C_INCLUDES\uff1a\u53ef\u9078\u8b8a\u6578\uff0c\u8868\u793a\u6a19\u982d\u6a94\u6848\u7684\u641c\u5c0b\u8def\u5f91\u3002\u9810\u8a2d\u7684\u6a19\u982d\u6a94\u6848\u7684\u641c\u5c0b\u8def\u5f91\u662fLOCAL_PATH\u76ee\u9304\u3002\u793a\u4f8b\uff1aLOCAL_C_INCLUDES := sources\/foo\u6216LOCAL_C_INCLUDES := $(LOCAL_PATH)\/..\/foo<br \/>\n6\uff0cTARGET_ARCH\uff1a\u76ee\u6a19 CPU\u5e73\u81fa\u7684\u540d\u5b57\uff1bTARGET_PLATFORM\uff1aAndroid.mk \u89e3\u6790\u7684\u6642\u5019\uff0c\u76ee\u6a19 Android \u5e73\u81fa\u7684\u540d\u5b57\uff1bTARGET_ARCH_ABI\uff1a\u66ab\u6642\u53ea\u652f\u63f4\u5169\u500b value\uff0carmeabi \u548c armeabi-v7a<br \/>\n7\uff0cLOCAL_STATIC_LIBRARIES: \u8868\u793a\u8a72\u6a21\u7d44\u9700\u8981\u4f7f\u7528\u54ea\u4e9b\u975c\u614b\u5eab\uff0c\u4ee5\u4fbf\u5728\u7de8\u8b6f\u6642\u9032\u884c\u9023\u7d50\u3002<br \/>\n8\uff0cLOCAL_SHARED_LIBRARIES:  \u8868\u793a\u6a21\u7d44\u5728\u57f7\u884c\u6642\u8981\u4f9d\u8cf4\u7684\u5171\u4eab\u5eab\uff08\u52d5\u614b\u5eab\uff09\uff0c\u5728\u9023\u7d50\u6642\u5c31\u9700\u8981\uff0c\u4ee5\u4fbf\u5728\u751f\u6210\u6a94\u6848\u6642\u5d4c\u5165\u5176\u76f8\u61c9\u7684\u8cc7\u8a0a\u3002<br \/>\n9\uff0cLOCAL_LDLIBS:  \u7de8\u8b6f\u6a21\u7d44\u6642\u8981\u4f7f\u7528\u7684\u9644\u52a0\u7684\u9023\u7d50\u5668\u9078\u9805\u3002<br \/>\n10\uff0cLOCAL_ARM_MODE: \u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c arm\u76ee\u6a19\u4e8c\u9032\u5236\u6703\u4ee5 thumb \u7684\u5f62\u5f0f\u751f\u6210(16 \u4f4d)\uff0c\u4f60\u53ef\u4ee5\u901a\u904e\u8a2d\u5b9a\u9019\u500b\u8b8a\u6578\u70ba arm\u5982\u679c\u4f60\u5e0c\u671b\u4f60\u7684 module \u662f\u4ee5 32 \u4f4d\u6307\u4ee4\u7684\u5f62\u5f0f<br \/>\n11\uff0cLOCAL_CFLAGS:  \u53ef\u9078\u7684\u7de8\u8b6f\u5668\u9078\u9805\uff0c\u5728\u7de8\u8b6f C \u7a0b\u5f0f\u78bc\u6a94\u6848\u7684\u6642\u5019\u4f7f\u7528<br \/>\n12\uff0cinclude $(call all-subdir-makefiles)\uff1a\u8fd4\u56de\u4e00\u500b\u4f4d\u65bc\u7576\u524d&#8217;my-dir&#8217;\u8def\u5f91\u7684\u5b50\u76ee\u9304\u4e2d\u7684\u6240\u6709Android.mk\u7684\u5217\u8868\u3002<\/p>\n<p>\uff082\uff09\u5728Android\u4e2d\u589e\u52a0\u672c\u5730\u7a0b\u5f0f\u6216\u8005\u5eab\uff0c\u9019\u4e9b\u7a0b\u5f0f\u548c\u5eab\u8207\u5176\u6240\u8f09\u8def\u5f91\u6c92\u6709\u4efb\u4f55\u95dc\u4fc2\uff0c\u53ea\u548c\u5b83\u5011\u7684Android.mk\u6a94\u6848\u6709\u95dc\u4fc2\u3002Android.mk\u548c\u666e\u901a\u7684Makefile\u6709\u6240\u4e0d\u540c\uff0c\u5b83\u5177\u6709\u7d71\u4e00\u7684\u5beb\u6cd5\uff0c\u4e3b\u8981\u5305\u542b\u4e00\u4e9b\u7cfb\u7d71\u516c\u5171\u7684\u5de8\u96c6\u3002\u5728\u4e00\u500bAndroid.mk\u4e2d\u53ef\u4ee5\u751f\u6210\u591a\u500b\u53ef\u57f7\u884c\u7a0b\u5f0f\u3001\u52d5\u614b\u5eab\u548c\u975c\u614b\u5eab\u3002 <\/p>\n<p>A\uff0c\u7de8\u8b6fC\/C++\u61c9\u7528\u7a0b\u5f0f\u7684\u6a21\u677f\uff1a<br \/>\n#Test Exe<br \/>\nLOCAL_PATH := $(call my-dir)<br \/>\n#include $(CLEAR_VARS)<br \/>\nLOCAL_SRC_FILES:= main.c<br \/>\nLOCAL_MODULE:= test_exe<br \/>\n#LOCAL_C_INCLUDES :=<br \/>\n#LOCAL_STATIC_LIBRARIES :=<br \/>\n#LOCAL_SHARED_LIBRARIES :=<br \/>\ninclude $(BUILD_EXECUTABLE) \uff08\u83dc\u9ce5\u7d1a\u5225\u89e3\u91cb\uff1a:=\u662f\u8ce6\u503c\u7684\u610f\u601d\uff0c+=\u662f\u8ffd\u52a0\u7684\u610f\u601d\uff0c$\u662f\u5f15\u7528\u67d0\u8b8a\u6578\u7684\u503c\uff09BUILD_EXECUTABLE\u8868\u793a\u4ee5\u4e00\u500b\u53ef\u57f7\u884c\u7a0b\u5f0f\u7684\u65b9\u5f0f\u9032\u884c\u7de8\u8b6f\u3002<br \/>\n\u88dc\u5145\u8aaa\u660e\uff1ainclude $(BUILD_PACKAGE)\u5247\u662f\u7de8\u8b6f\u51fa\u4e00\u500bapk\uff0cinclude $(BUILD_STATIC_JAVA_LIBRARY)\u5247\u662f\u7de8\u8b6f\u51fajar\u5305\u3002<\/p>\n<p>B\uff0c\u7de8\u8b6f\u975c\u614b\u5eab\u7684\u6a21\u677f\uff1a<br \/>\n#Test Static Lib<br \/>\nLOCAL_PATH := $(call my-dir)<br \/>\ninclude $(CLEAR_VARS)<br \/>\nLOCAL_SRC_FILES:= \/<br \/>\n        helloworld.c<br \/>\nLOCAL_MODULE:= libtest_static<br \/>\n#LOCAL_C_INCLUDES :=<br \/>\n#LOCAL_STATIC_LIBRARIES :=<br \/>\n#LOCAL_SHARED_LIBRARIES :=<br \/>\ninclude $(BUILD_STATIC_LIBRARY)<br \/>\n\u4e00\u822c\u7684\u548c\u4e0a\u9762\u76f8\u4f3c\uff0cBUILD_STATIC_LIBRARY\u8868\u793a\u7de8\u8b6f\u4e00\u500b\u975c\u614b\u5eab.a\u6a94\u6848\u3002\u975c\u614b\u5eab\u4e0d\u6703\u8907\u88fd\u5230\u7684APK\u5305\u4e2d\uff0c\u4f46\u662f\u80fd\u5920\u7528\u65bc\u7de8\u8b6f\u5171\u4eab\u5eab\u3002<\/p>\n<p>C\uff0c\u7de8\u8b6f\u52d5\u614b\u5eab\u7684\u6a21\u677f\uff1a<br \/>\n#Test Shared Lib<br \/>\nLOCAL_PATH := $(call my-dir)<br \/>\ninclude $(CLEAR_VARS)<br \/>\nLOCAL_SRC_FILES:= \/<br \/>\n          helloworld.c<br \/>\nLOCAL_MODULE:= libtest_shared<br \/>\nTARGET_PRELINK_MODULES := false<br \/>\n#LOCAL_C_INCLUDES :=<br \/>\n#LOCAL_STATIC_LIBRARIES :=<br \/>\n#LOCAL_SHARED_LIBRARIES :=<br \/>\ninclude $(BUILD_SHARED_LIBRARY) \u4e00\u822c\u7684\u548c\u4e0a\u9762\u76f8\u4f3c\uff0cBUILD_SHARED_LIBRARY\u8868\u793a\u7de8\u8b6f\u4e00\u500b\u52d5\u614b\u5eab\u3002<br \/>\n\u4ee5\u4e0a\u4e09\u8005\u7684\u751f\u6210\u7d50\u679c\u5206\u5225\u5728\u5982\u4e0b\uff0cgeneric\u4f9d\u5177\u9ad4target\u6703\u8b8a\uff1a<br \/>\nout\/target\/product\/generic\/obj\/EXECUTABLE<br \/>\nout\/target\/product\/generic\/obj\/STATIC_LIBRARY<br \/>\nout\/target\/product\/generic\/obj\/SHARED_LIBRARY<br \/>\n\u6bcf\u500b\u6a21\u7d44\u7684\u76ee\u6a19\u8cc7\u6599\u593e\u5206\u5225\u70ba\uff1a<br \/>\n\u53ef\u57f7\u884c\u7a0b\u5f0f\uff1aXXX_intermediates<br \/>\n\u975c\u614b\u5eab\uff1a   XXX_static_intermediates<br \/>\n\u52d5\u614b\u5eab\uff1a   XXX_shared_intermediates<\/p>\n<p>\uff083\uff09\u53e6\u5916\uff0c\u5728Android.mk\u6a94\u6848\u4e2d\uff0c\u9084\u53ef\u4ee5\u6307\u5b9a\u6700\u5f8c\u7684\u76ee\u6a19\u5b89\u88dd\u8def\u5f91\uff0c\u7528LOCAL_MODULE_PATH\u548cLOCAL_UNSTRIPPED_PATH\u4f86\u6307\u5b9a\u3002\u4e0d\u540c\u7684\u6a94\u6848\u7cfb\u7d71\u8def\u5f91\u7528\u4ee5\u4e0b\u7684\u5de8\u96c6\u9032\u884c\u9078\u64c7\uff1a<br \/>\nTARGET_ROOT_OUT\uff1a\u8868\u793a\u6839\u6a94\u6848\u7cfb\u7d71out\/target\/product\/generic\/root\u3002<br \/>\nTARGET_OUT\uff1a\u8868\u793asystem\u6a94\u6848\u7cfb\u7d71out\/target\/product\/generic\/system\u3002<br \/>\nTARGET_OUT_DATA\uff1a\u8868\u793adata\u6a94\u6848\u7cfb\u7d71out\/target\/product\/generic\/data\u3002<br \/>\nOUT_DIR\uff1a\u7a0b\u5f0f\u78bc\u5de5\u7a0b\u7de8\u8b6f\u6642\u7684out\u751f\u6210\u76ee\u9304<br \/>\nPRODUCT_OUT\uff1a\u6620\u8c61\u751f\u6210\u76ee\u9304<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f86\u6e90\uff1ahttps:\/\/itw01.com\/FGD5EYV.html \u4e00\u500bAndroid.mk file\u7528\u4f86\u5411\u7de8<span class=\"post-excerpt-end\">&hellip;<\/span><\/p>\n<p class=\"more-link\"><a href=\"https:\/\/learn-house.idv.tw\/?p=2376\" class=\"themebutton\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-2376","post","type-post","status-publish","format-standard","hentry","category-5"],"_links":{"self":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/2376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2376"}],"version-history":[{"count":0,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/2376\/revisions"}],"wp:attachment":[{"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learn-house.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}