Включить библиотеку.so в apk в андроид студии

Я пробую свои силы в разработке простого приложения для Android, в котором я пытаюсь использовать http://sqlcipher.net/, который использует библиотеки.so для внутреннего использования. Я прочитал документацию о том, как использовать sqlcipher с приложением для Android. Я следовал за шагами, и он компилируется без ошибок. Но во время выполненияUnsatisfiedLinkError,

Поглядывая на это, я обнаружил, что gradle еще не поддерживает библиотеки.so, но я нашел здесь хак, который я пытаюсь использовать. Но это выдает ошибку времени компиляции в строке #40 по сути, которая,

tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
    pkgTask.jniDir new File(buildDir, 'native-libs')
}

поговорка

Не удалось найти свойство 'com' в проекте '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, пожалуйста, извините меня, если я что-то неправильно понял.

3 ответа

Решение

У меня такая же проблема. Проверьте комментарий в https://gist.github.com/khernyo/4226923

Это говорит:

для gradle android plugin v0.3 используйте "com.android.build.gradle.tasks.PackageApplication"

Это должно исправить вашу проблему.

Я попробовал решение, представленное в принятом ответе, и оно не сработало для меня. Я хотел поделиться тем, что ДЕЙСТВИТЕЛЬНО для меня, поскольку это могло бы помочь кому-то еще. Я нашел это решение здесь.

В основном, что вам нужно сделать, это положить .so файлы внутри папки с именем lib (Примечание: это не libs и это не ошибка). Он должен быть в той же структуре, что и в APK файл.

В моем случае это было:
Проект:
|--Lib:
|- |--armeabi:
|- |- |-. так файлы.

Итак, я создал папку lib, а внутри нее - папку armeabi, в которую я вставил все необходимые файлы.so. Затем я заархивировал папку в .zip (структура внутри zip-файла теперь lib/armeabi/*.so) Я переименовал .zip подать в armeabi.jar и добавил строку compile fileTree(dir: 'libs', include: '*.jar') в dependencies {} в файле сборки Gradle.

Это решило мою проблему довольно чисто.

Чтобы включить нативные библиотеки, вам нужно:

  1. создать файл "jar" со специальной структурой, содержащий файлы ".so";
  2. включить этот файл в список зависимостей.

Чтобы создать файл 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')
Другие вопросы по тегам