91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-15 06:06:13 來源:腳本之家 閱讀:373 作者:zenny_chen 欄目:移動開發

對于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.c
LOCAL_SRC_FILES += my_blocks_data.c
LOCAL_SRC_FILES += my_runtime.c

# 條件預編譯,如果當前架構為ARMv7以下的架構,則定義MY_NO_CSWAP這個宏
ifeq ($(TARGET_ARCH_ABI),armeabi)
  LOCAL_CFLAGS := -DMY_NO_CSWAP=1
endif

# 連接系統編譯出的靜態庫
LOCAL_STATIC_LIBRARIES := cpufeatures
LOCAL_STATIC_LIBRARIES += ld.gold

LOCAL_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 := mytest

LOCAL_SRC_FILES := test.c

LOCAL_STATIC_LIBRARIES := cpufeatures
LOCAL_STATIC_LIBRARIES += ld.gold

# 連接我們前面聲明好的靜態庫
LOCAL_STATIC_LIBRARIES += my_blocks

# 連接我們前面聲明好的動態庫
# LOCAL_SHARED_LIBRARIES += my_blocks

LOCAL_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模塊所使用的動態庫或靜態庫。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

牡丹江市| 威远县| 淮滨县| 绥化市| 太仓市| 温州市| 双城市| 巴青县| 富阳市| 绥化市| 宜州市| 宣化县| 来凤县| 甘肃省| 邹城市| 乐东| 右玉县| 陆河县| 紫阳县| 和林格尔县| 乌拉特后旗| 六盘水市| 额尔古纳市| 松溪县| 衡阳市| 兴义市| 扶绥县| 云梦县| 铜陵市| 肃宁县| 敦煌市| 乐昌市| 丰镇市| 聂荣县| 江永县| 吴桥县| 泸州市| 恭城| 安仁县| 兴和县| 黄冈市|