我有一個應用程序2本地庫。 1st在ARMv7上運行得更快,所以我的版本都是針對ARMv7和ARMv5的。 2nd在兩個平臺上的工作方式都相同,因此只提供ARMv5庫。Android L預覽不搜索「armeabi」文件夾中的本地庫(UnsatisfiedLinkError)
我的本地庫文件夾是這樣的:
/jniLibs/
|
+---armeabi/
| |
| +---libFirstLibrary.so
| +---libSecondLibrary.so
|
+---armeabi-v7a/
|
+---libFirstLibrary.so
的應用效果良好的所有設備和Android版本的生產。
當我與L-預覽(錘頭lpv79預覽-ac1d8a8e.tgz)測試了我的Nexus 5,我得到這個錯誤:
java.lang.UnsatisfiedLinkError: Couldn't load SecondLibrary from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.package-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.package-1, /vendor/lib, /system/lib]]]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:610)
的問題是,儘管Nexus 5的有CPU_ABI
設置爲armeabi-v7a
和CPU_ABI2
設置爲armeabi
,L-Preview僅使用CPU_ABI
值,並且僅在「armeabi-v7a」文件夾中查找「SecondLibrary」,並且因爲它不存在而崩潰。
當我將.so文件複製到「armeabi-v7a」文件夾時,一切正常,但是APK的大小是3.5 MB,我並不喜歡它。
這僅僅是Android L-Preview或一些「新功能」的bug嗎?
一般來說,但幾乎所有設備都支持兩個ABI。就我而言,Nexus 5支持:'CPU_ABI = armeabi-v7a'和'CPU_ABI2 = armeabi'。對於主設備ABI爲「x86」但輔助爲「armeabi」的英特爾設備使用相同的機制,因此即使在「x86」文件夾中沒有本機庫,我的應用也可在英特爾設備上正常運行。在我看來,沒有理由說這種方法在L-Preview上不起作用。 – xsveda 2014-09-03 19:15:09
是的,但是如果在主ABI目錄中沒有找到,則包管理器僅檢查輔助ABI目錄中的庫。我鏈接的文檔說:「包管理器服務將掃描.apk並查找任何共享庫的形式:lib//lib .so [...]如果找到一個,那麼它被複制到' $ APPDIR/lib/lib .so' [...]如果找不到,並且定義了輔助ABI,則該服務將掃描以下格式的共享庫:lib//lib 。所以」。所以如果主要的ABI目錄不是空的,它不會檢查次要的。 –
mstorsjo
2014-09-03 19:30:28
這就是我原來的答案 - 它只能從一個單一的體系結構目錄中提取 - 它可以是主要的或次要的ABI。 – mstorsjo 2014-09-03 19:36:55