Обычно, когда вы используете пакет 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
}