一個簡單的"hello world"的例子,比如明也,下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk
'helloworld.c'是一個JNI共享庫,實現(xiàn)返回"hello world"字符串的原生方法。
相應的Android.mk文件會像下面這樣:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
解釋一下這幾行代碼:
LOCAL_PATH := $(call my-dir)
一個Android.mk file首先必須定義好LOCAL_PATH變量办素。它用于在開發(fā)樹中查找源文件。在這個例子中祸穷,宏函數(shù)’my-dir’, 由編譯系統(tǒng)提供性穿,用于返回當前路徑(即包含Android.mk file文件的目錄)。
include $( CLEAR_VARS)
CLEAR_VARS由編譯系統(tǒng)提供雷滚,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 需曾。這是必要的,因為所有的編譯控制文件都在同一個GNU MAKE執(zhí)行環(huán)境中祈远,所有的變量都是全局的呆万。
LOCAL_MODULE := helloworld
LOCAL_MODULE變量必須定義,以標識你在Android.mk文件中描述的每個模塊车份。名稱必須是唯一的谋减,而且不包含任何空格。注意編譯系統(tǒng)會自動產(chǎn)生合適的前綴和后綴扫沼,換句話說出爹,一個被命名為'foo'的共享庫模塊,將會生成'libfoo.so'文件缎除。
**重要注意事項: **
如果你把庫命名為‘libhelloworld’严就,編譯系統(tǒng)將不會添加任何的lib前綴,也會生成libhelloworld.so器罐,這是為了支持來源于Android平臺的源代碼的Android.mk文件盈蛮,如果你確實需要這么做的話。
LOCAL_SRC_FILES := helloworld.c
LOCAL_SRC_FILES變量必須包含將要編譯打包進模塊中的C或C++源代碼文件技矮。注意抖誉,你不用在這里列出頭文件和包含文件,因為編譯系統(tǒng)將會自動為你找出依賴型的文件衰倦;僅僅列出直接傳遞給編譯器的源代碼文件就好袒炉。【注意樊零,默認的C++源碼文件的擴展名是’.cpp’. 指定一個不同的擴展名也是可能的我磁,只要定義LOCAL_DEFAULT_CPP_EXTENSION變量孽文,不要忘記開始的小圓點(也就是定義為‘.cxx’,而不是‘cxx’)(當然這一步我們一般不會去改它)】
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是編譯系統(tǒng)提供的變量,指向一個GNU Makefile腳本(應該就是在build/core目錄下的shared_library.mk)夺艰,負責收集自從上次調(diào)用'include $(CLEAR_VARS)'以來芋哭,定義在LOCAL_XXX變量中的所有信息,并且決定編譯什么郁副,如何正確地去做减牺。并根據(jù)其規(guī)則生成靜態(tài)庫。同理對于靜態(tài)庫存谎。
#LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES := libswscale-4.so
include $(PREBUILT_SHARED_LIBRARY)
#LOCAL_PATH := $(call my-dir)
$(warning "the value of LOCAL_PATH is$(LOCAL_PATH)")
include $(CLEAR_VARS)
LOCAL_MODULE := FfmpegCmd
LOCAL_SRC_FILES := com_mazaiting_ffmpegcmdtest_FFmpegCmd.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c
LOCAL_C_INCLUDES := F:/test/FFmpegCmdTest/ffmpeg-3.3.6-1
LOCAL_LDLIBS := -llog -lz -ldl
LOCAL_SHARED_LIBRARIES := avcodec avdevice avfilter avformat avutil swresample swscale
include $(BUILD_SHARED_LIBRARY)
解釋:
- LOCAL_MODULE 本地模塊
- LOCAL_SRC_FILES 本地源文件
- PREBUILT_SHARED_LIBRARY 指已經(jīng)編譯好的動態(tài)庫
-
(LOCAL_PATH)") 可以打印出LOCAL_PATH這個變量
- LOCAL_C_INCLUDES 本地源碼路徑
- LOCAL_LDLIBS 指定庫或至少要鏈接到結果中的對象
- LOCAL_SHARED_LIBRARIES 編譯好的動態(tài)庫拔疚,為此模塊中的依賴