Включить .so-библиотеку в apk в андроид-студию
Я пытаюсь разобраться с простым андроидным приложением, в котором я пытаюсь использовать sqlcipher, который использует .so библиотеки внутри, Я прочитал документацию по как использовать sqlcipher с Android-приложением. Я выполнил шаги, и он компилируется без каких-либо ошибок. Но во время выполнения он выбрасывает UnsatisfiedLinkError
.
Подойдя к нему, я обнаружил, что gradle еще не поддерживает .so библиотеки, но я нашел hack здесь, который я пытаюсь использовать. Но он выдает ошибку времени компиляции в строке # 40 на основе, которая есть,
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, 'native-libs')
}
говоря
Не удалось найти свойство 'com' в Project 'MyProject'
Здесь я отправляю код из файла build.gradle.
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
dependencies {
compile files('libs/android-support-v4.jar')
compile files('libs/commons-codec.jar')
compile files('libs/guava-r09.jar')
compile files('libs/sqlcipher.jar')
}
targetCompatibility = 1.6
sourceCompatibility = 1.6
android {
target = 'android-14'
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 9
targetSdkVersion 16
}
}
task copyNativeLibs(type: Copy) {
from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, 'native-libs')
}
Может, кто-нибудь, пожалуйста, помогите мне в том, что я сделал неправильно или что мне делать, чтобы включить эти .so библиотеки в мой apk?
Поскольку я новичок в разработке Android и gradle, прошу извиниться за меня, если я что-то не понял.
Ответы
Ответ 1
У меня была та же проблема. Отметьте комментарий в https://gist.github.com/khernyo/4226923#comment-812526
В нем говорится:
для gradle плагин android v0.3 использовать "com.android.build.gradle.tasks.PackageApplication"
Это должно решить вашу проблему.
Ответ 2
Я пробовал решение, представленное в принятом ответе, и это не сработало для меня.
Я хотел поделиться тем, что DID работает для меня, поскольку это может помочь кому-то другому. Я нашел это решение здесь.
В основном вам нужно поместить ваши файлы .so
в папку с именем lib
(Примечание: это не libs
, и это не ошибка). Он должен быть в той же структуре, что и в файле APK
.
В моем случае это было:
Проект:
| --lib:
| - | --armeabi:
| - | - | -. поэтому файлы.
Итак, я создал папку lib и внутри нее папку armeabi, где я вставил все необходимые файлы .so. Затем я закрепил папку в .zip
(структура внутри zip файла теперь является lib/armeabi/*. Поэтому) Я переименовал файл .zip
в armeabi.jar
и добавил строку compile fileTree(dir: 'libs', include: '*.jar')
в dependencies {}
в файл сборки gradle.
Это решило мою проблему довольно чистым способом.
Ответ 3
Чтобы включить собственные библиотеки, вам необходимо:
- создать файл "jar" со специальной структурой, содержащей файлы ".so";
- включить этот файл в список зависимостей.
Чтобы создать файл jar, используйте следующий фрагмент:
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
Чтобы включить результирующий файл, вставьте следующую строку в раздел "зависимости" в файле "build.gradle":
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')