成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

AndroidNDK生成及連接靜態(tài)庫與動(dòng)態(tài)庫的方法

對(duì)于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的目錄布局。

成都創(chuàng)新互聯(lián)專注于伊金霍洛企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),成都商城網(wǎng)站開發(fā)。伊金霍洛網(wǎng)站建設(shè)公司,為伊金霍洛等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

在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)

# 這里要注意的是,對(duì)于一次預(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)容:

Android NDK生成及連接靜態(tài)庫與動(dòng)態(tài)庫的方法

在arm64-v8a、armeabi等每個(gè)架構(gòu)名目錄下,都要包含有我們?cè)诘谝粋€(gè)工程中生成出來的靜態(tài)庫或動(dòng)態(tài)庫文件,并且要與架構(gòu)名相一致。比如一下是arm64-v8a下的內(nèi)容:

Android NDK生成及連接靜態(tài)庫與動(dòng)態(tà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

最后,我們?cè)贘ava端只需加載我們當(dāng)前所要執(zhí)行的動(dòng)態(tài)庫模塊即可,不需要關(guān)心前一個(gè)工程所生成的、用于給當(dāng)前JNI模塊所使用的動(dòng)態(tài)庫或靜態(tài)庫。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)站欄目:AndroidNDK生成及連接靜態(tài)庫與動(dòng)態(tài)庫的方法
當(dāng)前URL:http://jinyejixie.com/article8/pgepop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、、定制開發(fā)、Google、虛擬主機(jī)網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
长子县| 宿州市| 南涧| 丰台区| 吉木乃县| 阿城市| 武隆县| 镇安县| 湘西| 泾阳县| 子长县| 中方县| 民勤县| 比如县| 青神县| 定远县| 南安市| 襄垣县| 桑植县| 闻喜县| 普安县| 泰顺县| 罗平县| 深州市| 兴义市| 改则县| 庄河市| 成武县| 扎囊县| 容城县| 孙吴县| 屏南县| 孝昌县| 合江县| 贵阳市| 彰化市| 锡林浩特市| 攀枝花市| 凤翔县| 永寿县| 双流县|