[英]How to tell Gradle not to exclude .so files in my .jar dependency?
我有一個.jar
依賴項,里面有.so
庫。
library.jar
|
-----com/company
|
-----.class files
-----libs
|
-----libX.so
jar在內部使用這個.so
庫,我正在構建一個使用jar的Android應用程序。
一切都很好,直到我構建apk:通過使用7zip探索它,我發現.so
文件已經消失,導致使用應用程序時的各種錯誤。
那么有什么方法可以告訴Gradle在構建時不要排除.so
文件? 我不想將它們手動復制到我的Android項目中的文件夾中,因為我沒有直接使用它們,但.jar
庫是加載它們的庫。
編輯1:添加build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.company.myapp"
minSdkVersion 24
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation files('libs/lib1.jar')
implementation files('libs/lib2.jar')
}
編輯2:以下是@shizhen先前建議的解決方案
1-我的.jar
包含libs
目錄中的.so
文件。 我不得不重命名為lib
。
2-我解壓縮.jar
以收集.so
文件。
3-我創建了src/jniLibs
文件夾並將.so
文件放在各自的<ANDROID_ABI>
文件夾中。
4-我修改了build.gradle
文件以包含:
android {
...
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDir 'src/jniLibs'
}
}
}
5 - 瞧! 最終的.apk
現在包括本機庫。
一切都很好,直到我構建apk:通過使用7zip探索它,我發現.so文件已經消失,導致使用應用程序時的各種錯誤。
我相信你的jar依賴不是最初用於android而是通常用於Java。
Android應用程序使用.dex格式,因此所有.jar依賴項都將重新打包到一個或多個dex文件中。 您的.so文件將不會被使用,因為它在jar中。
那么有什么方法可以告訴Gradle在構建時不要排除.so文件? 我不想將它們手動復制到我的Android項目中的文件夾中,因為我沒有直接使用它們,但.jar庫是加載它們的庫。
所以,為了你的罐子適應Android應用程序,你必須解壓罐子取出所有的.so文件,並手動把它們放到src/jniLibs/<ANDROID_ABI>/
,如
jniLibs
├── arm64-v8a
│ ├── libxxx.so
│ └── libyyy.so
├── armeabi-v7a
│ ├── libxxx.so
│ └── libyyy.so
├── x86
│ ├── libxxx.so
│ └── libyyy.so
└── x86_64
├── libxxx.so
└── libyyy.so
只是猜測基於Android文檔“收縮你的代碼和資源” :似乎ProGuard自動用於發布版本,以便刪除明顯未使用的代碼。 您可以嘗試禁用它:
// …
buildTypes {
release {
minifyEnabled false
useProguard false
}
}
// …
只需在build.gradle中設置sourceSets(模塊:app)
android {
...
...
sourceSets {
main {
jniLibs.srcDirs = [
'./src/main/jniLibs'
]
}
}
}
如果您的項目需要,請使用ndk:
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.