国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android NDK生成及連接靜態庫與動態庫的方法

2019-10-21 21:41:51
字體:
來源:轉載
供稿:網友

對于Android應用開發,大部分情況下我們使用Java就能完整地實現一個應用。但是在某些情況下,我們需要借助C/C++來寫JNI本地代碼。比如,在使用跨平臺的第三方庫的時候;為了提升密集計算性能的時候(這種情況下往往還可能會直接使用匯編語言)。因此,這里我將為大家介紹如何給其它開發者創建可供使用的靜態庫或動態庫。而應用開發者如何去連接這些生成的靜態庫或動態庫。由于現在Android Studio已經比較成熟,因此以下描述將基于Android Studio的目錄布局。

在Android Studio的一個項目工程下,會有一個app文件夾,這個文件夾主要存放我們編寫應用的所有代碼以及相關其它資源。如果我們需要寫JNI,那么就需要在這個目錄下創建jni文件夾。jni文件夾里必須包含Android.mk文件、Application.mk文件以及你所要編譯的源文件。下面我們先給出編譯生成提供給第三方開發者使用的靜態庫與動態庫的Android.mk文件內容:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 編譯后生成的模塊名,在Java端使用System.loadLibrary加載模塊的的時候直接用此名LOCAL_MODULE := my_blocks# LOCAL_SRC_FILES用于添加源文件(可以是.c,.cpp,.s等)LOCAL_SRC_FILES := my_block_test.cLOCAL_SRC_FILES += my_blocks_data.cLOCAL_SRC_FILES += my_runtime.c# 條件預編譯,如果當前架構為ARMv7以下的架構,則定義MY_NO_CSWAP這個宏ifeq ($(TARGET_ARCH_ABI),armeabi)  LOCAL_CFLAGS := -DMY_NO_CSWAP=1endif# 連接系統編譯出的靜態庫LOCAL_STATIC_LIBRARIES := cpufeaturesLOCAL_STATIC_LIBRARIES += ld.goldLOCAL_LDLIBS := -llog# 用于生成動態庫# include $(BUILD_SHARED_LIBRARY)# 用于生成靜態庫include $(BUILD_STATIC_LIBRARY)$(call import-module,cpufeatures)

然后,我們把上述編譯腳本中所列出的my_block_test.c、my_blocks_data.c以及my_runtime.c這三個源文件放在jni目錄下即可編譯。

最后,用Android JNI編譯器工具——ndk_build編譯完之后就可在生成的obj目錄下看到my_blocks.a文件了。在Unix/Linux下,.a表示靜態庫文件;.so表示動態共享庫文件。

下面我們將創建另一個工程,這個工程將構建最終可執行的應用。其Android.mk文件描述如下:

LOCAL_PATH := $(call my-dir)### 以下這段用于預構建我們將要連接的已存在的靜態庫或動態庫 ###include $(CLEAR_VARS)# 我們將連接已編譯好的my_blocks模塊LOCAL_MODULE  := my_blocks# 填寫源文件名的時候,要把靜態庫或動態庫的文件名填寫完整。# $(TARGET_ARCH_ABI)/ 表示將不同架構下的庫文件存放到相應架構目錄下LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.a# LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.so# 用于預構建靜態庫(后面可被連接)include $(PREBUILT_STATIC_LIBRARY)# 用于預構建動態庫(后面可被連接)# include $(PREBUILT_SHARED_LIBRARY)# 這里要注意的是,對于一次預構建只能預構建動態庫,要么是靜態庫,兩者不能共存### 以下內容用于描述編譯當前工程的源代碼 ###include $(CLEAR_VARS)LOCAL_MODULE := mytestLOCAL_SRC_FILES := test.cLOCAL_STATIC_LIBRARIES := cpufeaturesLOCAL_STATIC_LIBRARIES += ld.gold# 連接我們前面聲明好的靜態庫LOCAL_STATIC_LIBRARIES += my_blocks# 連接我們前面聲明好的動態庫# LOCAL_SHARED_LIBRARIES += my_blocksLOCAL_LDLIBS := -llog# 將此模塊構建為動態庫include $(BUILD_SHARED_LIBRARY)$(call import-module,cpufeatures)

下面我們來看一下這個工程jni的目錄結構內容:

Android,NDK,靜態庫,動態庫

在arm64-v8a、armeabi等每個架構名目錄下,都要包含有我們在第一個工程中生成出來的靜態庫或動態庫文件,并且要與架構名相一致。比如一下是arm64-v8a下的內容:

Android,NDK,靜態庫,動態庫

然后,我們需要編輯Application.mk文件,如下所示:

# 使用當前NDK編譯器所支持的所有處理器架構APP_ABI := all# 使用LLVM Clang 3.6編譯器工具鏈NDK_TOOLCHAIN_VERSION=clang3.6# 開啟C11標準,外加GNU語法擴展APP_CFLAGS += -std=gnu11# 啟用Blocks語法APP_CFLAGS += -fblocks

最后,我們在Java端只需加載我們當前所要執行的動態庫模塊即可,不需要關心前一個工程所生成的、用于給當前JNI模塊所使用的動態庫或靜態庫。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝清县| 小金县| 舟曲县| 博罗县| 长岛县| 岑溪市| 绥德县| 海淀区| 闵行区| 郑州市| 义马市| 枞阳县| 原平市| 通道| 涪陵区| 临夏县| 田东县| 娄烦县| 高安市| 荔浦县| 乌恰县| 射阳县| 天峨县| 盐城市| 开鲁县| 浦北县| 洛阳市| 辽宁省| 河源市| 四会市| 望奎县| 南木林县| 盐源县| 舒兰市| 车致| 开鲁县| 桃园市| 临潭县| 加查县| 长宁县| 株洲市|