如何在Android Studio中找到打包在AAR中的jni库,其中包含gradle 2.3.1和xFF1F的Android插件;

如何在Android Studio中找到打包在AAR中的jni库,其中包含gradle 2.3.1和xFF1F的Android插件;,android,Android,我的项目必须对依赖项使用AAR。 AAR打包了一些类和一个jni库(例如libdemo.so)。 jni库在我的项目中用作本地共享库 对于gradle 2.2.3的Android插件,我采用以下两种方式: 1.手动解包AAR并将libdemo.so放入与Android.mk相关的目录: 2.AAR在构建/中间阶段未打包。因此,我在Android.mk中设置了libdemo.So的路径: 但对于gradle 2.3.1的Android插件,规则改变了: 构建缓存:存储Android插件生成的特定输

我的项目必须对依赖项使用AAR。 AAR打包了一些类和一个jni库(例如libdemo.so)。 jni库在我的项目中用作本地共享库

对于gradle 2.2.3的Android插件,我采用以下两种方式:

1.手动解包AAR并将libdemo.so放入与Android.mk相关的目录:

2.AAR在构建/中间阶段未打包。因此,我在Android.mk中设置了libdemo.So的路径:

但对于gradle 2.3.1的Android插件,规则改变了:

构建缓存:存储Android插件生成的特定输出 在构建项目时(例如未打包的AAR和预编制索引) 远程依赖项)

我指定了一个相对于gradle.properties文件的路径

 android.buildCacheDir=buildcache
它可以工作,我可以看到缓存,但找不到libdemo。因此直接构建缓存:

我现在不能走第二条路。
有没有更方便的方法链接jni库?

对于使用Android NDK的项目,使用Gradle实验版将jni功能实现到应用程序中更容易

解压缩AAR包后,可以访问
*.so
库文件。下面是一个示例gradle函数,用于将AAR提取到包含
*的相应生成路径。因此
文件:

task extractSo(type: Copy) {
    from zipTree("${project.rootDir}/libraries/name-of-aar-package.aar")
    into "${project.rootDir}/libraries/"
    include "jni/**/name-of-so-library.so"
}
在整个项目的基本
build.gradle
文件中定义
extractSo
任务。要使用Gradle实验版本,还必须在base
build.Gradle
文件中定义Gradle实验的类路径,如下所示:

buildscript {
    repositories {
        jcenter()
    }

   dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.9.0'
    }
}
要调用
extractSo
任务,必须在build.gradle文件中为需要该函数的项目模块定义对该函数的依赖关系。下面是一些执行此操作的示例代码:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 25
        buildToolsVersion = "25.0.2"

        defaultConfig.with {
            applicationId = "com.my.sample.package.ndkapp"
            minSdkVersion.apiLevel = 19
            targetSdkVersion.apiLevel = 24
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-android.txt'))
        }
    }
    android.ndk {
        moduleName = "nativeclass_jni"
        cppFlags.add("-std=c++11")
        cppFlags.add("-I" + file("src/main/jni").absolutePath)
        // Add the necessary headers required in cpp code.
        cppFlags.add("-I" + file("${project.rootDir}/libraries/headers").absolutePath)

        stl = "gnustl_shared"
        // Add the necessary project .so files for all architectures.
        ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/arm64-v8a").absolutePath)
        ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/armeabi-v7a").absolutePath)
        ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/x86").absolutePath)

        ldLibs.addAll(["log", "android", "EGL", "GLESv2"])

        // Specific the particular .so files this sample links against.
        ldLibs.add("name-of-so-library")
    }
    android.productFlavors {
        create ("fat") {
            // This sample builds all architectures by default. Note that if you
            // only want to build for a specific architecture, you need to
            // remove the appropriate lines below. You also need to remove the
            // .so files from the apk using
            // "packagingOptions {exclude('lib/armeabi-v7a/*')}" in the android
            // section.
            ndk.abiFilters.add("arm64-v8a")
            ndk.abiFilters.add("armeabi-v7a")
            ndk.abiFilters.add("x86")
        }
    }
}

dependencies {
    // specify any Android java modules this project depends on
    // For example:
    // compile files('libs/android-support-v4.jar')
}

// Extract the *.so libraries packaged in AAR files.
build.dependsOn(':extractSo')
为了确保Java代码可以访问*.so文件中的本机函数和本机Android代码,现在必须在主活动中加载库,如下所示:

static {
     // Loading your native code module
     System.loadLibrary("nativeclass_jni");
     // Loading your extracted *.so library
     System.loadLibrary("name-of-so-library");
}
apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 25
        buildToolsVersion = "25.0.2"

        defaultConfig.with {
            applicationId = "com.my.sample.package.ndkapp"
            minSdkVersion.apiLevel = 19
            targetSdkVersion.apiLevel = 24
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-android.txt'))
        }
    }
    android.ndk {
        moduleName = "nativeclass_jni"
        cppFlags.add("-std=c++11")
        cppFlags.add("-I" + file("src/main/jni").absolutePath)
        // Add the necessary headers required in cpp code.
        cppFlags.add("-I" + file("${project.rootDir}/libraries/headers").absolutePath)

        stl = "gnustl_shared"
        // Add the necessary project .so files for all architectures.
        ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/arm64-v8a").absolutePath)
        ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/armeabi-v7a").absolutePath)
        ldFlags.add("-L" + file("${project.rootDir}/libraries/jni/x86").absolutePath)

        ldLibs.addAll(["log", "android", "EGL", "GLESv2"])

        // Specific the particular .so files this sample links against.
        ldLibs.add("name-of-so-library")
    }
    android.productFlavors {
        create ("fat") {
            // This sample builds all architectures by default. Note that if you
            // only want to build for a specific architecture, you need to
            // remove the appropriate lines below. You also need to remove the
            // .so files from the apk using
            // "packagingOptions {exclude('lib/armeabi-v7a/*')}" in the android
            // section.
            ndk.abiFilters.add("arm64-v8a")
            ndk.abiFilters.add("armeabi-v7a")
            ndk.abiFilters.add("x86")
        }
    }
}

dependencies {
    // specify any Android java modules this project depends on
    // For example:
    // compile files('libs/android-support-v4.jar')
}

// Extract the *.so libraries packaged in AAR files.
build.dependsOn(':extractSo')
static {
     // Loading your native code module
     System.loadLibrary("nativeclass_jni");
     // Loading your extracted *.so library
     System.loadLibrary("name-of-so-library");
}