我有一個使用一些JNI代碼的Android應用程序。長話短說(雙關語意),幾乎不可能將JNI庫轉換爲64位,因爲它需要很多改變。代碼(Java和JNI)在armeabi-v7a體系結構上很好地工作。在Android上強制CPU/ABI到armeabi-v7a
這些庫正在使用loadLibrary加載。當我嘗試在Nexus 6上運行我的應用時,該應用加載正常。一旦loadLibrary被執行,應用程序就會崩潰,描述的錯誤爲here。
這個問題,據我瞭解,在Nexus 6上執行時,應用程序會建立爲arm64-8a。但是這些庫不是爲arm64-8a構建的(因爲64位版本在問題開始時提到了問題)。
我的問題是,我可以強制arm64-8a設備也運行armeabi-v7a代碼?如何強制我的應用程序apk成爲armeabi-v7a,因此無論設備如何,它只有32位?
感謝您的回答。我認爲複雜性會阻礙你在第二段中描述的內容 - 我定義了外部依賴關係(特別是領域和亞馬遜AWS),他們似乎正在下載arm64-v8a。我將我的JNI庫改爲.a文件,但不知道如何正確加載它。我能否強迫我的圖書館在加載之前等有機會影響ABI選擇?依賴關係在app build.gradle中定義,例如'compile'com.amazonaws:aws-android-sdk-s3:2.2.11'' – LNI
加載的庫的實際順序無關緊要;重要的是APK中存在不同的ABI目錄。如果你的一個依賴項包含'arm64-v8a',那麼這個目錄將會在APK中結束,APK安裝程序將選擇這個體系結構。嘗試查看您的構建APK('unzip -l filename.apk')並查看它包含的架構目錄。但是,您可以做的是過濾掉實際包含哪些ABI;嘗試在您的gradle文件中添加'abiFilters'armeabi-v7a'',以使其僅包含這種單一架構。 – mstorsjo
我將您的答案標記爲正確,因爲我可以驗證在另一個64位庫不存在時應用程序默認爲32位。在我的情況下,問題是由realm-android引起的 - 我在應用程序和項目build.gradle文件中都有條目來啓用領域插件。這迫使arm64-v8a庫被加載。我會嘗試abiFilters步驟並修改此評論。 – LNI