在ANE中如果SDK調(diào)用了so庫(kù)祭椰,則需要把so庫(kù)放到ANE下Android-ARM/lib/armeabi (調(diào)試模式)或者 armeabi-v7a(發(fā)行模式)下。
可以貼個(gè)ADT代碼說(shuō)明問(wèn)題:
//m_configType.equals("apk") 是否是發(fā)行模式
//(hasCaptiveRuntime() 是否帶運(yùn)行時(shí)
if ((m_configType.equals("apk")) || (hasCaptiveRuntime()))
{
destApkDirectory = "lib/armeabi-v7a/";
}
else
{
destApkDirectory = "lib/armeabi/";
}
而這個(gè)armeabi和armeabi-v7a究竟是什么意思集侯?
有什么深意么?
為什么調(diào)試模式和發(fā)行模式adobe會(huì)選擇不同的文件夾?
我在這篇記錄下我對(duì)于這個(gè)小問(wèn)題的理解刚夺。
armeabi與armeabi-v7a表示支持不同的CPU類型
armeabi是指的該so庫(kù)用于ARM的通用CPU闸衫,而v7a的CPU支持硬件浮點(diǎn)運(yùn)算涛贯。因此armeabi通用性強(qiáng),但速度慢蔚出,而v7a能充分發(fā)揮v7a CPU的能力弟翘,在AIR打包APK調(diào)試模式adobe選擇的是通用性強(qiáng)的armeabi模式。
android支持不同CPU的深層含義
首先從硬件支持方便來(lái)看骄酗,我們的adnroid設(shè)備目前為止大部分都是支持ARM芯片稀余,(當(dāng)然市面上此刻最新的android機(jī)器還支持intel等另外的幾個(gè)芯片,例如intel最新的凌動(dòng)項(xiàng)目芯片趋翻,就獲得了android4.1的青睞)睛琳。從android版本與支持ARM硬件編碼的程度來(lái)看:
起初android1.6:只支持armv4與armv5te指令集。
到了android2.0:增加了支持arm-vfp踏烙,armv6掸掏,armv6t2指令集。
到了android2.2:增加支持armv7-a指令集宙帝。
所以armeabi-v7a 應(yīng)該是與AIR限定支持android2.2以上的條件有關(guān)丧凤。android2.2以上能讓硬件發(fā)揮更大的作用。
我項(xiàng)目中使用armeabi還是armeabi-v7a
對(duì)于AIR項(xiàng)目來(lái)說(shuō)性能問(wèn)題是最大的瓶頸步脓,能優(yōu)化一點(diǎn)就一點(diǎn)愿待,所以如果接平臺(tái)方SDK或者寫(xiě)ANE的時(shí)候使用到SO庫(kù)浩螺,個(gè)人推薦全部放到armeabi-v7a下,而不要為了兼容放到armeabi仍侥。
-EOF-
在我們android APK的根目錄有一個(gè) libs文件夾要出,此文件夾下包含了armeabi 和armeabi-v7a兩個(gè)文件夾,我們的c代碼編譯成的本地庫(kù)(各種.so)就會(huì)放在這兩個(gè)文件夾其中的一個(gè)农渊。那armeabi-v7a 與 armeabi有什么區(qū)別患蹂,都是什么意思呢?
armeabi和armeabi-v7a是表示cpu的類型砸紊,我們知道一般的手機(jī)或平板都是用arm的cpu(mips的就悲催的被忽視了)传于,不同的cpu的特性不一樣,armeabi就是針對(duì)普通的或舊的arm v5 cpu醉顽,armeabi-v7a是針對(duì)有浮點(diǎn)運(yùn)算或高級(jí)擴(kuò)展功能的arm v7 cpu沼溜。
在android.mk里可配置以下宏:
TARGET_CPU_API := armeabi
APP_ABI := armeabi
當(dāng)你編譯時(shí)出現(xiàn)一些鏈接動(dòng)態(tài)庫(kù)的undefine錯(cuò)誤,或你的apk運(yùn)行時(shí)出現(xiàn)裝載.so動(dòng)態(tài)庫(kù)錯(cuò)誤時(shí)游添,不妨看一下這個(gè)cpu類型的配置是否有誤系草。
========================================================================================================
現(xiàn)在還有x86的了,其實(shí)armeabi 唆涝、armeabi-v7a 和x86是編譯 NDK 庫(kù)時(shí)找都,可以使用三種支持的應(yīng)用二進(jìn)制接口(ABI):
‘a(chǎn)rmeabi’ – 默認(rèn)選項(xiàng),將創(chuàng)建以基于 ARM* v5TE 的設(shè)備為目標(biāo)的庫(kù)廊酣。 具有這種目標(biāo)的浮點(diǎn)運(yùn)算使用軟件浮點(diǎn)運(yùn)算檐嚣。 使用此 ABI 創(chuàng)建的二進(jìn)制代碼將可以在所有 ARM* 設(shè)備上運(yùn)行。
‘a(chǎn)rmeabi-v7a’ – 創(chuàng)建支持基于 ARM* v7 的設(shè)備的庫(kù)啰扛,并將使用硬件 FPU 指令嚎京。
‘x86’ – 生成的二進(jìn)制代碼可支持包含基于硬件的浮點(diǎn)運(yùn)算的 IA-32 指令集。
==========================================================================================================
什么是 NEON隐解?
NEON* 是一種 ARM* 技術(shù)鞍帝,主要用于多媒體(智能手機(jī)和高清電視等)應(yīng)用。 ARM* 表示其基于 128 位 SIMD 引擎的技術(shù) – ARM* Cortex*(一種串行擴(kuò)展)—可提供比 ARM* v5 架構(gòu)至少高 3 倍的性能煞茫,以及比 ARM* v6 至少高 2 倍的性能帕涌。 如欲了解有關(guān)此技術(shù)的詳細(xì)信息,以深入了解 NEON 及其它性能考慮续徽,請(qǐng)?jiān)L問(wèn)以下網(wǎng)址:http://www.arm.com/products/processors/technologies/neon.php
此處的關(guān)鍵理念為蚓曼,各寄存器被“堆積”成一個(gè)矢量,其中每一個(gè)寄存器均為一個(gè)元素钦扭,并與其它元素的數(shù)據(jù)類型相匹配纫版。 在此基礎(chǔ)之上,運(yùn)算在管道內(nèi)執(zhí)行客情,因而這一方法被稱作 Packed SIMD其弊。
SSE: 英特爾推出的類似 NEON 的工具
SSE 指面向英特爾架構(gòu)(IA)的SIMD 流指令擴(kuò)展癞己。 目前,英特爾? 凌動(dòng)? 最高支持 SSSE3(補(bǔ)充 SIMD 流指令擴(kuò)展 3)梭伐。 凌動(dòng)? 暫不支持 SSE4.x痹雅。后者也是一個(gè) 128 位引擎,用于打包浮點(diǎn)數(shù)據(jù)糊识。 這一執(zhí)行模式開(kāi)始于 MMX 技術(shù)绩社。SSx 是較新的技術(shù),取代了 MMX赂苗。愉耙。 如欲了解詳細(xì)信息,請(qǐng)參閱英特爾《IA-32 和 IA-64 軟件開(kāi)發(fā)人員手冊(cè)》中的“第一卷: 基礎(chǔ)架構(gòu)”部分哑梳。網(wǎng)址為:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html。 目前绘盟,SSE 概述部分在 5.5 節(jié)鸠真。 它提供 SSE、SSE2龄毡、SSE3 和 SSSE3 的操作碼吠卷。注意,數(shù)據(jù)運(yùn)算通常會(huì)涉及到處理基于精度的打包浮點(diǎn)數(shù)值沦零;并且需要在 XMM 寄存器之間祭隔,或在這些寄存器與內(nèi)存之間批量傳輸數(shù)據(jù)。 XMM 寄存器主要用于取代 MMX 寄存器路操。