Android 如何告诉Gradle不要排除.jar依赖项中的.so文件?
我有一个Android 如何告诉Gradle不要排除.jar依赖项中的.so文件?,android,android-studio,gradle,android-gradle-plugin,apk,Android,Android Studio,Gradle,Android Gradle Plugin,Apk,我有一个.jar依赖项,它是附带的。所以它里面有一个库 library.jar | -----com/company | -----.class files -----libs | -----libX.so jar在内部使用了这个。因此,库,我正在构建一个使用jar的Android应用程序 在我构建apk之前,一切都很好:通过使用7zip探索
.jar
依赖项,它是附带的。所以它里面有一个库
library.jar
|
-----com/company
|
-----.class files
-----libs
|
-----libX.so
jar在内部使用了这个。因此,
库,我正在构建一个使用jar的Android应用程序
在我构建apk之前,一切都很好:通过使用7zip探索它,我发现。因此文件消失了,导致使用该应用程序时出现各种错误
那么,有没有办法告诉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
文件放在各自的
文件夹中
4-我修改了build.gradle
文件以包括:
android {
...
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDir 'src/jniLibs'
}
}
}
5-Et瞧!最后的.apk
现在包括了本机库。只是基于上的Android文档的猜测:似乎ProGuard自动用于发布版本,以便删除明显未使用的代码。您可以尝试禁用该选项:
// …
buildTypes {
release {
minifyEnabled false
useProguard false
}
}
// …
如果这有帮助,那么ProGuard将是你的罪魁祸首。然后,您可以尝试显式地删除不能删除的内容,而不是将其禁用
在我构建apk之前,一切都很好:通过使用7zip进行探索,我发现.so文件已经消失,导致使用该应用程序时出现各种错误
我相信您的jar依赖性最初不是针对android的,而是针对Java的
Android应用程序使用.dex格式,因此所有.jar依赖项都将重新打包到一个或多个dex文件中。您。因此文件不会被使用,因为它在jar中
那么,有没有办法告诉Gradle在构建时不要排除.So文件?我不想手动将它们复制到Android项目中的文件夹中,因为我没有直接使用它们,但是.jar库是加载它们的库
因此,为了使您的jar适应Android应用程序,您必须解压缩jar,取出所有的.So文件,然后手动将它们放入src/jniLibs/
,例如
jniLibs
├── arm64-v8a
│ ├── libxxx.so
│ └── libyyy.so
├── armeabi-v7a
│ ├── libxxx.so
│ └── libyyy.so
├── x86
│ ├── libxxx.so
│ └── libyyy.so
└── x86_64
├── libxxx.so
└── libyyy.so
只需在build.gradle(模块:app)中设置源集
如果您的项目需要,请使用ndk:
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
你的Gradle版本是什么样子的,或者至少是相关的部分?@Chriki我已经添加了我的版本。Gradle你的库包括哪些.so文件?谢谢你的回复。.jar
依赖项是使用JavaSE编写的,但包含本机的.so
libs Android ABIs。.jar
在名为libs/
的文件夹中有这些.so
库。然后它将它们提取到临时文件夹中,使用System.load()
加载它们。由于无法控制.jar
中的代码,手动将库添加到src/jniLibs/
不会解决问题,因为.jar
中的代码希望在其libs//
文件夹中找到它们。还有其他方法吗?Jar只不过是zip文件,取出.so文件并将其放入jniLibs中就行了,这就是我为JNA库所做的,与您的情况相同。请确保您的项目正确配置了jniLibs路径。您可以使用Android Studio分析您的最终apk,以仔细检查。软件包也非常感谢您!我将编辑我的答案以澄清我是如何处理这种情况的,但我基本上遵循了你的答案,编辑了build.gradle文件,并将.jar
中的libs
目录重命名为lib
。感谢你的建议,我真的希望这会有所帮助,但没有。问题似乎来自Android的DEX格式,没有重新打包jar中的.so
文件。
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "x86"
}
}