8

我的問題是針對64位Android系統的原生Android開發。Android NDK -multlib支持使用gradle

我正在尋找一種方法來配置在使用gradle構建系統的64位Android系統上支持32位編譯本機庫。應用程序應該使用的庫僅可用於32位版本。這將是非常耗時且容易出錯的將這些庫移植到64位。

因此,我想配置gradle以部署這些預建的32位二進制文​​件,並使用32位版本的Android應用程序。

當前的配置導致了以下錯誤:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: <application_name>, PID: 2170 
    java.lang.UnsatisfiedLinkError: 
dalvik.system.PathClassLoader 
[DexPathList[[zip file "/data/app/<application_name>/base.apk"], 
nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] 
enter code here`couldn't find "libmynativelibrary.so" 
    at java.lang.Runtime.loadLibrary(Runtime.java:366) 

它好像在PathClassLoader看起來錯誤的目錄。我檢查了提供的apk文件,它缺少這些庫。 apk內沒有lib文件夾。構建系統不包含32位庫。 由於armv7只有一個預構建版本,因此這些庫位於app/src/main/jnilibs文件夾中。

我必須補充一點,這個設置完美適用於任何32位Android系統。我之前用模擬器和一個物理設備嘗試了它。

應該如何使用gradle激活多元化32/64位支持?或者,如何使用Android Studio/gradle將32位應用程序部署到64位Android系統?

我搜索了網頁,發現了一個關於該主題的鏈接,但它指的是較舊的構建系統:https://source.android.com/source/64-bit-builds.html。我不知道如何採用gradle描述。

我正在使用Android Studio(Build:141.1989493,2015年6月6日)。 project/build.gradle未觸及。該app/build.gradle文件看起來像這樣:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "<application_name>" 
     minSdkVersion 1 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
               'proguard-rules.pro' 
     } 
     debug { 
      debuggable true 
     } 
    } 

    productFlavors { 
     armv7 { 
      ndk { 
       abiFilter "armeabi-v7a" 
      } 
     } 
     fat 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
} 

回答

1

爲了讓32位應用程序部署64位Android系統需要定義一個armv7 productFlavorjniLibs文件夾命名相應的架構內的子文件夾。在app/build.gradle

產品風味的定義:

android { 
    productFlavors { 
     armv7 { ndk { abiFilter "armeabi-v7a" } } 
     fat 
    } 
} 

機庫結構:

app/src/main/jniLibs/armeabi-v7a 
+0

任何人都可以解釋一下'productFlavors'中的'fat'是什麼,如果它是必需的? – mithil1501

2

mulilib的概念僅適用於使用的是Android系統構建的一部分項目,你不應該設置android:multiarch選項,因爲您只有32位庫,因爲此選項僅適用於向其他已安裝應用程序提供32位和64位庫的應用程序。

64位Android系統直接支持32位應用程序。您只需要將APK應用程序的lib/(armeabi-v7a,x86,...)中的.so文件打包好,就像任何Android設備一樣。

在安裝時,將安裝設備首選的體系結構的庫。即:如果沒有x86_64文件夾,x86庫將被安裝/如果沒有arm64-v8a文件夾,armeabi-v7a庫將被安裝,並且您的應用程序將以32位模式運行。

如果你在lib下沒有任何東西,這意味着Android Studio不知道你的.so文件。默認情況下,它將在jniLibs/(armeabi-v7a,x86,...)內查找它們,因此您應該將它們放在那裏或將sourceSets.main.jniLibs.srcDir更改爲您選擇的目錄。