如何查詢當前手機的cpu架構,so庫導入工程又出異常了?


執行adb命令:

adb shell 
cat /proc/cpuinfo

 

對應文件夾

AArch64 == arm64-v8a

ARMv7 == armeabi-v7a

............等

其他你們自己發現吧。

注意:這里我要說明一個開發中要注意的問題.

首先說明下android studio中apk打包so文件的機制和機器自動選擇so庫文件執行的問題

1.apk打包會把工程中出現的armeabi等文件按照原來的文件名直接打包到apk中,如果多個module中有相同的文件夾,會把module中的so文件合並成到一個文件夾中來。

  例如:module中有so文件夾armeabi,armeabi-v7a,x86,x86_64,(記住armeabi中具體的幾個so文件

      module中有so文件夾armeabi,armeabi-v7a,x86記住armeabi中具體的幾個so文件

      那么最后打包生成的apk文件中是這樣的

      

          

          

 

          很明顯兩個module中的相同文件夾下so文件合並了到一起了,那么說明apk最后會合並so文件。如果你的兩個module中有一個有另一個沒有的so文件夾及內容,apk依然會合並so文件夾,只是里面只有一個module中的so文件。例如上面圖片中,第一個module中就有"x86_64"這個文件夾,而第二個module中就沒有,但apk中會發現里面是有這個文件夾的,只是里面只有一個module中的so文件,這里就會引發一個問題,想知道就往下看。

 

2.打包完成后的apk文件安裝到手機中,手機會根據自己cpu的架構選擇對應的so文件夾執行so文件,目前的手機有多種cpu架構 ,如:armeabi,armeabi-v7a,arm64-v8a,x86,x86_64等,你會發現這個和我們上面android工程中的so文件夾名稱是一致的,這也說明了手機會選擇執行so文件夾中的文件。(注意:arm64架構的cpu,如果在apk中找到了arm64-v8a的文件夾,那么就會直接在里面找到要執行了so庫文件,如果沒有這個文件夾就會找armeabi文件下的so文件執行)

 

了解了上面了知識再來看下面:

1.如果你的android studio工程中使用了多個module,並且module中都加入了so庫文件,例如這樣:

 

那么你就要注意下,如果你的手機是arm64架構的那么按照上面的知識我們會知道,手機自動會去找arm64-v8a這個文件夾下的so文件,找不到該“文件夾”的話就去找armeabi文件夾下的so文件執行,那么按照上面的圖,手機會找不到文件夾,最后選擇找了armeabi文件夾,很好沒有錯。

但是,如果現在有個x86_64架構的手機那么按照之前的知識,手機一旦發現有x86_64這個文件夾就不會去找其他的文件夾,認定了這個文件夾中的so文件執行,那么你在操作app過程中點到或觸發了需要用到第二個module中的so文件時,我們會發現這個文件夾中根本沒有第二個module的so文件,那么很不幸這個會報錯,報的是找不到so文件 "java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader couldn't find "(某個).so"  那么現在你應該懂了是什么原因,明明我有so文件會什么會提示找不到呢?這就是原因.

如果你理解到這兒了,也許有的同學很淡定的復制第二個module中的x86文件夾然后改個名字變成x86_64,以為這樣就可以了,可以很明確的告訴你GG吧,這樣會報一個錯就是 Java.lang.UnsatisfiedLinkError: 32bit can't 64bit” 也就是不能把32位文件轉化為64位,雖然建文件夾是建對了,但so文件也不是亂用的。解決方案:去找找64位的so文件吧。

 

現在我希望大家能明白一點了,謝謝閱讀,有錯誤請指正謝謝.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM