今天遇到一個很蛋疼的問題,使用了網上的開源二維碼掃描,所用的so文件是32位的,在64位手機上報錯,解決的辦法是在項目目錄下的build.gradle文件中添加以下字段android
而後在項目文件夾下的gradle.properties文件中加入eclipse
android.useDeprecatedNdk=true
這時你的32位SO文件就能夠在64位手機上運行了。gradle
首先要明白ABI的概念: ABI(Application Binary Interface)實際就是指應用程序基於哪一種指令集來進行編譯,咱們能用到的ABI 也就四種 armeabi armeabi-v7a x86 和mips ,前二者是最多見的。ui
其次這4個編譯選項的含義: 1.‘armeabi’ – 默認選項,將建立以基於 ARM* v5TE 的設備爲目標的庫。 具備這種目標的浮點運算使用軟件浮點運算。 使用此 ABI 建立的二進制代碼將能夠在全部 ARM* 設備上運行。 2.‘armeabi-v7a’ – 建立支持基於 ARM* v7 的設備的庫,並將使用硬件 FPU 指令。 3.‘x86’ – 生成的二進制代碼可支持包含基於硬件的浮點運算的 IA-32 指令集. 4.mips — 支持應用二進制接口.net
總結: APP_ABI 賦值,就是爲了交叉編譯生成相應芯片可執行的指令集。直觀的看就是若是你將 APP_ABI := armeabi armeabi-v7a mips x86 那麼在你的android工程下邊的 libs 裏邊會出現 armeabi armeabi-v7a mips x86 這四個目錄下會分別生成 4個.so文件。程序在Android手機運行時,根據手機自身CPU芯片不一樣,去選擇調用相應的.so文件。code
附:若是要是使用eclipse開發。直接刪除arm64-v8a文件夾,和所依賴的動態庫中的arm64-v8a,由於64能夠向下兼容32位。因此請保持各個包中so文件相同。blog
轉 http://blog.csdn.net/k316378085/article/details/52034530 http://blog.csdn.net/qq_15003505/article/details/51592431接口