Android NDK生成及連接靜態(tài)庫與動(dòng)態(tài)庫的方法
對于Android應(yīng)用開發(fā),大部分情況下我們使用Java就能完整地實(shí)現(xiàn)一個(gè)應(yīng)用。但是在某些情況下,我們需要借助C/C++來寫JNI本地代碼。比如,在使用跨平臺(tái)的第三方庫的時(shí)候;為了提升密集計(jì)算性能的時(shí)候(這種情況下往往還可能會(huì)直接使用匯編語言)。因此,這里我將為大家介紹如何給其它開發(fā)者創(chuàng)建可供使用的靜態(tài)庫或動(dòng)態(tài)庫。而應(yīng)用開發(fā)者如何去連接這些生成的靜態(tài)庫或動(dòng)態(tài)庫。由于現(xiàn)在Android Studio已經(jīng)比較成熟,因此以下描述將基于Android Studio的目錄布局。
在Android Studio的一個(gè)項(xiàng)目工程下,會(huì)有一個(gè)app文件夾,這個(gè)文件夾主要存放我們編寫應(yīng)用的所有代碼以及相關(guān)其它資源。如果我們需要寫JNI,那么就需要在這個(gè)目錄下創(chuàng)建jni文件夾。jni文件夾里必須包含Android.mk文件、Application.mk文件以及你所要編譯的源文件。下面我們先給出編譯生成提供給第三方開發(fā)者使用的靜態(tài)庫與動(dòng)態(tài)庫的Android.mk文件內(nèi)容:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 編譯后生成的模塊名,在Java端使用System.loadLibrary加載模塊的的時(shí)候直接用此名 LOCAL_MODULE := my_blocks # LOCAL_SRC_FILES用于添加源文件(可以是.c,.cpp,.s等) LOCAL_SRC_FILES := my_block_test.c LOCAL_SRC_FILES += my_blocks_data.c LOCAL_SRC_FILES += my_runtime.c # 條件預(yù)編譯,如果當(dāng)前架構(gòu)為ARMv7以下的架構(gòu),則定義MY_NO_CSWAP這個(gè)宏 ifeq ($(TARGET_ARCH_ABI),armeabi) LOCAL_CFLAGS := -DMY_NO_CSWAP=1 endif # 連接系統(tǒng)編譯出的靜態(tài)庫 LOCAL_STATIC_LIBRARIES := cpufeatures LOCAL_STATIC_LIBRARIES += ld.gold LOCAL_LDLIBS := -llog # 用于生成動(dòng)態(tài)庫 # include $(BUILD_SHARED_LIBRARY) # 用于生成靜態(tài)庫 include $(BUILD_STATIC_LIBRARY) $(call import-module,cpufeatures)
然后,我們把上述編譯腳本中所列出的my_block_test.c、my_blocks_data.c以及my_runtime.c這三個(gè)源文件放在jni目錄下即可編譯。
最后,用Android JNI編譯器工具——ndk_build編譯完之后就可在生成的obj目錄下看到my_blocks.a文件了。在Unix/Linux下,.a表示靜態(tài)庫文件;.so表示動(dòng)態(tài)共享庫文件。
下面我們將創(chuàng)建另一個(gè)工程,這個(gè)工程將構(gòu)建最終可執(zhí)行的應(yīng)用。其Android.mk文件描述如下:
LOCAL_PATH := $(call my-dir) ### 以下這段用于預(yù)構(gòu)建我們將要連接的已存在的靜態(tài)庫或動(dòng)態(tài)庫 ### include $(CLEAR_VARS) # 我們將連接已編譯好的my_blocks模塊 LOCAL_MODULE := my_blocks # 填寫源文件名的時(shí)候,要把靜態(tài)庫或動(dòng)態(tài)庫的文件名填寫完整。 # $(TARGET_ARCH_ABI)/ 表示將不同架構(gòu)下的庫文件存放到相應(yīng)架構(gòu)目錄下 LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.a # LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.so # 用于預(yù)構(gòu)建靜態(tài)庫(后面可被連接) include $(PREBUILT_STATIC_LIBRARY) # 用于預(yù)構(gòu)建動(dòng)態(tài)庫(后面可被連接) # include $(PREBUILT_SHARED_LIBRARY) # 這里要注意的是,對于一次預(yù)構(gòu)建只能預(yù)構(gòu)建動(dòng)態(tài)庫,要么是靜態(tài)庫,兩者不能共存 ### 以下內(nèi)容用于描述編譯當(dāng)前工程的源代碼 ### include $(CLEAR_VARS) LOCAL_MODULE := mytest LOCAL_SRC_FILES := test.c LOCAL_STATIC_LIBRARIES := cpufeatures LOCAL_STATIC_LIBRARIES += ld.gold # 連接我們前面聲明好的靜態(tài)庫 LOCAL_STATIC_LIBRARIES += my_blocks # 連接我們前面聲明好的動(dòng)態(tài)庫 # LOCAL_SHARED_LIBRARIES += my_blocks LOCAL_LDLIBS := -llog # 將此模塊構(gòu)建為動(dòng)態(tài)庫 include $(BUILD_SHARED_LIBRARY) $(call import-module,cpufeatures)
下面我們來看一下這個(gè)工程jni的目錄結(jié)構(gòu)內(nèi)容:
在arm64-v8a、armeabi等每個(gè)架構(gòu)名目錄下,都要包含有我們在第一個(gè)工程中生成出來的靜態(tài)庫或動(dòng)態(tài)庫文件,并且要與架構(gòu)名相一致。比如一下是arm64-v8a下的內(nèi)容:
然后,我們需要編輯Application.mk文件,如下所示:
# 使用當(dāng)前NDK編譯器所支持的所有處理器架構(gòu) APP_ABI := all # 使用LLVM Clang 3.6編譯器工具鏈 NDK_TOOLCHAIN_VERSION=clang3.6 # 開啟C11標(biāo)準(zhǔn),外加GNU語法擴(kuò)展 APP_CFLAGS += -std=gnu11 # 啟用Blocks語法 APP_CFLAGS += -fblocks
最后,我們在Java端只需加載我們當(dāng)前所要執(zhí)行的動(dòng)態(tài)庫模塊即可,不需要關(guān)心前一個(gè)工程所生成的、用于給當(dāng)前JNI模塊所使用的動(dòng)態(tài)庫或靜態(tài)庫。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)雷達(dá)View效果的示例代碼
這篇文章主要介紹了Android實(shí)現(xiàn)雷達(dá)View效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android studio設(shè)計(jì)簡易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Android studio設(shè)計(jì)簡易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Android仿知乎懸浮功能按鈕FloatingActionButton效果
前段時(shí)間在看屬性動(dòng)畫,恰巧這個(gè)按鈕的效果可以用屬性動(dòng)畫實(shí)現(xiàn),下面通過本文給大家分享adroid仿知乎懸浮功能按鈕FloatingActionButton效果,需要的朋友參考下吧2017-04-04Android 自定義底部上拉控件的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Android 自定義底部上拉控件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android中ImageCropper矩形、圓形 裁剪框的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android中ImageCropper矩形、圓形 裁剪框的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2018-07-07學(xué)習(xí)使用Material Design控件(一)
這篇文章主要為大家介紹了學(xué)習(xí)使用Material Design控件的詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android實(shí)現(xiàn)滾動(dòng)刻度尺效果
本篇文章主要介紹了Android實(shí)現(xiàn)滾動(dòng)刻度尺效果,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Android 媒體庫數(shù)據(jù)更新方法總結(jié)
這篇文章主要介紹了Android 媒體庫數(shù)據(jù)更新方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-04-04android TextView中識(shí)別多個(gè)url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解
在本篇文章里小編給大家整理的是關(guān)于android TextView中識(shí)別多個(gè)url并分別點(diǎn)擊跳轉(zhuǎn)方法詳解,需要的朋友們可以學(xué)習(xí)參考下。2019-08-08Android自定義ViewFlipper實(shí)現(xiàn)滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewFlipper實(shí)現(xiàn)滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08