【轉】armeabi和armeabi-v7a

原文網址:http://blog.csdn.net/dxpqxb/article/details/7721156php

在咱們android APK的根目錄有一個 libs文件夾,此文件夾下包含了armeabi 和armeabi-v7a兩個文件夾,咱們的c代碼編譯成的本地庫(各類.so)就會放在這兩個文件夾其中的一個。那armeabi-v7a 與 armeabi有什麼區別,都是什麼意思呢?html

    armeabi和armeabi-v7a是表示cpu的類型,咱們知道通常的手機或平板都是用arm的cpu(mips的就悲催的被忽視了),不一樣的cpu的特性不同,armeabi就是針對普通的或舊的arm v5 cpu,armeabi-v7a是針對有浮點運算或高級擴展功能的arm v7 cpu。java

      在android.mk裏可配置如下宏:android

TARGET_CPU_API := armeabi架構

APP_ABI := armeabiapp

 

當你編譯時出現一些連接動態庫的undefine錯誤,或你的apk運行時出現裝載.so動態庫錯誤時,不妨看一下這個cpu類型的配置是否有誤。函數

========================================================================================================工具

如今還有x86的了,其實armeabi 、armeabi-v7a 和x86是編譯 NDK 庫時,可使用三種支持的應用二進制接口(ABI):性能

  1. ‘armeabi’ – 默認選項,將建立以基於 ARM* v5TE 的設備爲目標的庫。 具備這種目標的浮點運算使用軟件浮點運算。 使用此 ABI 建立的二進制代碼將能夠在全部 ARM* 設備上運行。
  2. ‘armeabi-v7a’ – 建立支持基於 ARM* v7 的設備的庫,並將使用硬件 FPU 指令。
  3. ‘x86’ – 生成的二進制代碼可支持包含基於硬件的浮點運算的 IA-32 指令集。

====================================================================================================學習

什麼是 NEON?

NEON* 是一種 ARM* 技術,主要用於多媒體(智能手機和高清電視等)應用。 ARM* 表示其基於 128 位 SIMD 引擎的技術 – ARM* Cortex*(一種串行擴展)—可提供比 ARM* v5 架構至少高 3 倍的性能,以及比 ARM* v6 至少高 2 倍的性能。 如欲瞭解有關此技術的詳細信息,以深刻了解 NEON 及其它性能考慮,請訪問如下網址:http://www.arm.com/products/processors/technologies/neon.php

此處的關鍵理念爲,各寄存器被「堆積」成一個矢量,其中每個寄存器均爲一個元素,並與其它元素的數據類型相匹配。 在此基礎之上,運算在管道內執行,於是這一方法被稱做 Packed SIMD。

SSE: 英特爾推出的相似 NEON 的工具

SSE 指面向英特爾架構(IA)的SIMD 流指令擴展。 目前,英特爾® 凌動™ 最高支持 SSSE3(補充 SIMD 流指令擴展 3)。 凌動™ 暫不支持 SSE4.x。後者也是一個 128 位引擎,用於打包浮點數據。 這一執行模式開始於 MMX 技術。SSx 是較新的技術,取代了 MMX。。 如欲瞭解詳細信息,請參閱英特爾《IA-32 和 IA-64 軟件開發人員手冊》中的「第一卷: 基礎架構」部分。網址爲:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html。 目前,SSE 概述部分在 5.5 節。 它提供 SSE、SSE二、SSE3 和 SSSE3 的操做碼。注意,數據運算一般會涉及處處理基於精度的打包浮點數值;而且須要在 XMM 寄存器之間,或在這些寄存器與內存之間批量傳輸數據。 XMM 寄存器主要用於取代 MMX 寄存器。

 

原文網址:http://blog.csdn.net/fristkey2/article/details/7870593

android目錄下的內容學習---abi

源碼下面第一個文件的名稱是abi,那麼abi是什麼?

    應用程序二進制接口(application binary interface,ABI) 描述了應用程序和操做系統之間,一個應用和它的庫之間,或者應用的組成部分之間的低接口 。ABI不一樣於API ,API定義了源代碼和庫之間的接口,所以一樣的代碼能夠在支持這個API的任何系統中編譯 ,然而ABI容許編譯好的目標代碼在使用兼容ABI的系統中無需改動就能運行。 ABI掩蓋了各類細節,例如:調用約定控制着函數的參數如何傳送以及如何接受返回值;系統調用的編碼和一個應用如何向操做系統進行系統調用;以及在一個完整的操做系統ABI中,對象文件的二進制格式、程序庫等等。一個完整的ABI,像 Intel二進制兼容標準 (iBCS) ,容許支持它的操做系統上的程序不經修改在其餘支持此ABI的操做體統上運行。其餘的 ABI 標準化細節包括C++ name decoration和同一個平臺上的編譯器之間的調用約定,可是不包括跨平臺的兼容性。在Unix的操做系統中,存在不少運行在同一件平臺上互相相關可是不兼容的操做系統(尤爲是80386兼容系統)。有一些努力嘗試標準化A I,以減小銷售商將程序移植到其餘系統時所需的工做。然而,直到如今尚未很成功的例子,雖然LBS正在爲Linux作這方面的努力。

    那目錄下都有什麼內容?

    abi-app:  Android.mk

                   include:

                   src:

    再看看include目錄下的內容:

        -rw-r--r-- 1 ckt ckt 5220 2012-08-14 15:58 cxxabi.h
        -rw-r--r-- 1 ckt ckt 2539 2012-08-14 15:58 new
        -rw-r--r-- 1 ckt ckt 2661 2012-08-14 15:58 typeinfo
   再看看src目錄下的內容:

      ckt@ckt-desktop:~/work/tuna/abi/cpp/src$ ls -Alh
      total 68K
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 array_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 class_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.7K 2012-08-14 15:58 delete.cc
      -rw-r--r-- 1 ckt ckt  13K 2012-08-14 15:58 dynamic_cast.cc
      -rw-r--r-- 1 ckt ckt 1.7K 2012-08-14 15:58 enum_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 function_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 fundamental_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 new.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 pbase_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 pointer_to_member_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 pointer_type_info.cc
      -rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 si_class_type_info.cc
-  rw-r--r-- 1 ckt ckt 2.6K 2012-08-14 15:58 type_info.cc
-rw-r--r-- 1 ckt ckt 1.8K 2012-08-14 15:58 vmi_class_type_info.cc

android的armeabi和armeabi-v7a

原文網址:http://gybin.iteye.com/blog/2031565

在ANE中若是SDK調用了so庫,則須要把so庫放到ANE下Android-ARM/lib/armeabi (調試模式)或者 armeabi-v7a(發行模式)下。

能夠貼個ADT代碼說明問題:

 

//m_configType.equals("apk") 是不是發行模式
//(hasCaptiveRuntime() 是否帶運行時
 if ((m_configType.equals("apk")) || (hasCaptiveRuntime()))
    {
      destApkDirectory = "lib/armeabi-v7a/";
    }
    else
    {
      destApkDirectory = "lib/armeabi/";
    }

 

 

而這個armeabi和armeabi-v7a到底是什麼意思?

有什麼深意麼?

爲何調試模式和發行模式adobe會選擇不一樣的文件夾?

我在這篇記錄下我對於這個小問題的理解。

  • armeabi與armeabi-v7a表示支持不一樣的CPU類型

armeabi是指的該so庫用於ARM的通用CPU,而v7a的CPU支持硬件浮點運算。所以armeabi通用性強,但速度慢,而v7a能充分發揮v7a CPU的能力,在AIR打包APK調試模式adobe選擇的是通用性強的armeabi模式。

 

  • android支持不一樣CPU的深層含義

首先從硬件支持方便來看,咱們的adnroid設備目前爲止大部分都是支持ARM芯片,(固然市面上此刻最新的android機器還支持intel等另外的幾個芯片,例如intel最新的凌動項目芯片,就得到了android4.1的青睞)。從android版本與支持ARM硬件編碼的程度來看:

起初android1.6:只支持armv4與armv5te指令集。

到了android2.0:增長了支持arm-vfp,armv6,armv6t2指令集。

到了android2.2:增長支持armv7-a指令集。

因此armeabi-v7a 應該是與AIR限定支持android2.2以上的條件有關。android2.2以上能讓硬件發揮更大的做用。

  • 我項目中使用armeabi仍是armeabi-v7a

對於AIR項目來講性能問題是最大的瓶頸,能優化一點就一點,因此若是接平臺方SDK或者寫ANE的時候使用到SO庫,我的推薦所有放到armeabi-v7a下,而不要爲了兼容放到armeabi。

-EOF-

 

在咱們android APK的根目錄有一個 libs文件夾,此文件夾下包含了armeabi 和armeabi-v7a兩個文件夾,咱們的c代碼編譯成的本地庫(各類.so)就會放在這兩個文件夾其中的一個。那armeabi-v7a 與 armeabi有什麼區別,都是什麼意思呢?

    armeabi和armeabi-v7a是表示cpu的類型,咱們知道通常的手機或平板都是用arm的cpu(mips的就悲催的被忽視了),不一樣的cpu的特性不同,armeabi就是針對普通的或舊的arm v5 cpu,armeabi-v7a是針對有浮點運算或高級擴展功能的arm v7 cpu。

      在android.mk裏可配置如下宏:

TARGET_CPU_API := armeabi

APP_ABI := armeabi

 

當你編譯時出現一些連接動態庫的undefine錯誤,或你的apk運行時出現裝載.so動態庫錯誤時,不妨看一下這個cpu類型的配置是否有誤。

========================================================================================================

如今還有x86的了,其實armeabi 、armeabi-v7a 和x86是編譯 NDK 庫時,可使用三種支持的應用二進制接口(ABI):

  1. ‘armeabi’ – 默認選項,將建立以基於 ARM* v5TE 的設備爲目標的庫。 具備這種目標的浮點運算使用軟件浮點運算。 使用此 ABI 建立的二進制代碼將能夠在全部 ARM* 設備上運行。
  2. ‘armeabi-v7a’ – 建立支持基於 ARM* v7 的設備的庫,並將使用硬件 FPU 指令。
  3. ‘x86’ – 生成的二進制代碼可支持包含基於硬件的浮點運算的 IA-32 指令集。

==========================================================================================================

什麼是 NEON?

NEON* 是一種 ARM* 技術,主要用於多媒體(智能手機和高清電視等)應用。 ARM* 表示其基於 128 位 SIMD 引擎的技術 – ARM* Cortex*(一種串行擴展)—可提供比 ARM* v5 架構至少高 3 倍的性能,以及比 ARM* v6 至少高 2 倍的性能。 如欲瞭解有關此技術的詳細信息,以深刻了解 NEON 及其它性能考慮,請訪問如下網址: http://www.arm.com/products/processors/technologies/neon.php

此處的關鍵理念爲,各寄存器被「堆積」成一個矢量,其中每個寄存器均爲一個元素,並與其它元素的數據類型相匹配。 在此基礎之上,運算在管道內執行,於是這一方法被稱做 Packed SIMD。

SSE: 英特爾推出的相似 NEON 的工具

SSE 指面向英特爾架構(IA)的SIMD 流指令擴展。 目前,英特爾® 凌動™ 最高支持 SSSE3(補充 SIMD 流指令擴展 3)。 凌動™ 暫不支持 SSE4.x。後者也是一個 128 位引擎,用於打包浮點數據。 這一執行模式開始於 MMX 技術。SSx 是較新的技術,取代了 MMX。。 如欲瞭解詳細信息,請參閱英特爾《IA-32 和 IA-64 軟件開發人員手冊》中的「第一卷: 基礎架構」部分。網址爲: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html。 目前,SSE 概述部分在 5.5 節。 它提供 SSE、SSE二、SSE3 和 SSSE3 的操做碼。注意,數據運算一般會涉及處處理基於精度的打包浮點數值;而且須要在 XMM 寄存器之間,或在這些寄存器與內存之間批量傳輸數據。 XMM 寄存器主要用於取代 MMX 寄存器。

相關文章
相關標籤/搜索