142

内部で .so ライブラリを使用するsqlcipherを使用しようとしている単純な Android アプリケーションを開発しようとしています。Android app で sqlcipher を使用する方法に関するドキュメントを読みました。手順に従いましたが、エラーなしでコンパイルされます。ただし、実行時にスローされますUnsatisfiedLinkError

グーグルで調べてみると、gradleはまだ.soライブラリをサポートしていないことがわかりましたが、ここで使用しようとしているハックを見つけました。しかし、要点の40行目でコンパイル時エラーがスローされます。

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

言って

プロジェクト 'MyProject' でプロパティ 'com' が見つかりませんでした

ここでは、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に慣れていないので、何か誤解していたら申し訳ありません。

4

3 に答える 3

68

ネイティブ ライブラリを含めるには、次のものが必要です。

  1. 「.so」ファイルを含む特別な構造を持つ「jar」ファイルを作成します。
  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')
于 2013-07-31T15:30:27.793 に答える
28

私も同じ問題を抱えていました。https://gist.github.com/khernyo/4226923#comment-812526のコメントを確認してください。

それは言います:

gradle android プラグイン v0.3 の場合、「com.android.build.gradle.tasks.PackageApplication」を使用します

これで問題が解決するはずです。

于 2013-05-22T17:14:45.383 に答える