首页 > 解决方案 > 如何在 JNI andriod 项目的 AAR 中使用 .so 文件?

问题描述

我正在创建一个由构建服务器在编译时下载的 AAR,它将包含一个 C++ 预编译库,其中包含 .so 文件。我已经完成了相应文件的 c++ 和 AAR。但是,我无法通过为测试库而制作的简单测试应用程序来使用它。

显然问题是我没有告诉项目如何以 JNI 可以加载的方式链接 AAR 的内容。我似乎不知道如何将这些 AAR 文件用于 .so 资源,这是一项硬性要求。就好像在它与它一起编译之后它implementation project丢失了 /jni 文件夹(它显然在它的压缩内容中)

我确认我在 AAR 中有带有插件的 .so 文件。表明

-jni
   -x86
      libmyproject.so
   -armeabi-v7a
      libmyproject.so

除了我不关心的其他 lib/res/assets 等。

运行我的项目,我在 myproject-Android-release 和 build/aar-debug 中看到预期的文件 myproject-Android-debug.aar。这就是我想要它们的地方。

在我的 settings.gradle 我有

include ':myproject-Android-debug',':myproject-Android-release'

在我的 build.gradle 我有

import xxx

buildscript {
    apply plugin: 'xxxx'
    dependencies {
        classpath brazil.tool('AndroidGradle', 'AndroidSDK', 'KotlinGradlePlugin', 'xxxx')
    }
}

apply plugin: 'xxx'
apply plugin: 'xxx-android-sdk'
apply plugin: 'com.android.application'
apply plugin: 'xxx-android'


configurations {
    ktlint
}

dependencies {
    implementation brazil.build()
    testImplementation xxx.testbuild()
    ktlint brazil.tool('Ktlint')
    implementation project(":myproject-Android-debug")
}

android {
    compileSdkVersion SDK.platformVersion.toInteger()
    buildToolsVersion SDK.buildToolsVersion

    defaultConfig {
        applicationId "com.company.testapp"
        minSdkVersion 23
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            // let gradle pack the shared library into apk
            //possibly here?
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    lintOptions {
        abortOnError false
    }

    packagingOptions {
        exclude "/META-INF/proguard/**"
    }
}

task ktlint(type: JavaExec) {
    inputs.files(project.fileTree(dir: "src", include: "**/*.kt"))
    outputs.dir("${buildDir}/reports/ktlint/")
    group = 'verification'
    main = "com.github.xxxx"
    classpath = configurations.ktlint
    args = [
            "--reporter=plain",
            "--reporter=checkstyle,output=${buildDir}/reports/ktlint/ktlint-report.xml",
            "src/**/*.kt"
    ]
}
check.dependsOn ktlint

task ktlintFormat(type: JavaExec) {
    group = 'verification'
    main = "xxx"
    classpath = xxx
}

崩溃输出

2020-04-24 01:20:57.150 10387-10387/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.company.testapp, PID: 10387
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/base.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_dependencies_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_0_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_1_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_2_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_3_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_4_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_5_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_6_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_7_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_8_apk.apk", zip file "/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.company.testapp-4-XMV-9aZlJXyboIRl92bA==/lib/x86, /system/lib]]] couldn't find "libmyproject.so"
at java.lang.Runtime.loadLibrary0(Runtime.java:1012)
at java.lang.System.loadLibrary(System.java:1669)
at com.company.project.MainActivity.<clinit>(MainActivity.kt:33)

标签: androidjava-native-interfacebuild.gradleaar

解决方案


推荐阅读