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"
    }
}