Android Gradle - как включить общий объект с определенной структурой папок? - PullRequest
0 голосов
/ 13 мая 2018

Обычно, когда вы используете пакет Android Gradle, вы можете включать отдельные общие объекты (.so) с помощью параметра конфигурации jniLibs.srcDirs..so файл включается простым способом.Но что, если я хочу включить плагины в соответствующие им подпапки?

Также с учетом вкусов продуктов?

Я загрузил здесь хотя бы один демонстрационный проект:

https://sourceforge.net/p/syncproj/code/HEAD/tree/sampleScripts/AndroidGradlePackage

(В случае, если вы хотите поиграть самостоятельно - это немного упрощенный проект Android java-c ++).

В настоящее время структура папок следующая:

bin\Debug\armeabi-v7a\libnative_lib.so

Я хочу добавить структуру папок следующим образом:

bin\Debug\armeabi-v7a\plugins
bin\Debug\armeabi-v7a\plugins\test1
bin\Debug\armeabi-v7a\plugins\test1\test1.so

Здесь существует отчет об ошибке: https://issuetracker.google.com/issues/63707864

со статусом «Не будет исправлено» - но если этоне исправлено - может быть, есть какой-то обходной путь?

Я попробовал хотя бы то, что упомянуто на этой странице - создается структура папок плагинов с файлами * so.recipe внутри, но без файлов .so дляпочему-то - кто-то, кажется, отфильтровывает .so оттуда.

Самое интересное, что сгенерированный файл build \ native-libs \ native-libs.jar действительно содержит 1. * .so и 2. * .soфайлы .recipe, но включаются только 2-ые.

Одно из упомянутых здесь решений:

https://medium.com/keepsafe-engineering/the-perils-of-loading-native-libraries-on-android-befa49dce2db

Попытки заменить java 'System.loadLibrary' - но нет ли более простого решения для этого?

Таким образом, это решение может включать * .so.recipe в пакет .apk: (на всякий случай, если вы хотите попробовать продолжить мой подход) (должно применяться к ссылке на проект выше после зависимостей)

dependencies {
        implementation 'com.android.support.constraint:constraint-layout:1.0.2'
        // See (*)
        compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
    }



// See (*)
task nativeLibsToJar(type: Zip) {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: getCurrentConfigAbiDir() + "/plugins", include: '**/*.so*')
    // '/lib/armeabi-v7a' - same folder as in .apk package
    into '/lib/' + getCurrentAbiFolder() + "/plugins"
}

//
// (*) Walk around issue of not being able to add files recursively from sub-folders as well.
// https://issuetracker.google.com/issues/63707864
//
tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

//------------------------------------------------------------------------------------------------
// Helper functions
//------------------------------------------------------------------------------------------------

//
//  Gets current Abi folder name, empty if not detected - for example "armeabi-v7a"
//
String getCurrentAbiFolder()
{
    String[] props = getCommandLineArgs()
    if( props.length != 2 )
        return ""

    String platform = props[0]
    String config = props[1]
    String r = ""

    android.productFlavors.all { flavour ->
        if( flavour.name.toLowerCase() == platform.toLowerCase() )
            r = flavour.ndk.abiFilters.first().toLowerCase()
    }

    // println r
    return r
}


String getCurrentConfigAbiDir()
{
    String dirToZip = "DoesNotExists"

    String[] props = getCommandLineArgs()
    if( props.length != 2 )
        return dirToZip

    String platform = props[0]
    String config = props[1]

    android.productFlavors.all { flavour ->
        if( flavour.name.toLowerCase() == platform.toLowerCase() )
            dirToZip = "bin/" + config + "/" + flavour.ndk.abiFilters.first().toLowerCase()
    }

    // println dirToZip
    return dirToZip
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...