IT story

안드로이드 스튜디오에서 APK에 .so 라이브러리 포함

hot-time 2020. 6. 22. 07:38
반응형

안드로이드 스튜디오에서 APK에 .so 라이브러리 포함


이 질문에는 이미 답변이 있습니다.

내부적으로 .so 라이브러리를 사용 하는 sqlcipher 를 사용하려는 간단한 안드로이드 응용 프로그램을 개발하려고 노력하고 있습니다 . Android 앱에서 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')
}

아무도 내가 잘못한 일이나 APK에 .so 라이브러리를 포함 시키려면 어떻게해야합니까?

Android 개발 및 gradle을 처음 사용하기 때문에 내가 잘못 이해 한 경우 사과하십시오.


나는 같은 문제가 있었다. https://gist.github.com/khernyo/4226923#comment-812526 에서 의견을 확인 하십시오.

그것은 말한다 :

gradle 안드로이드 플러그인 v0.3의 경우 "com.android.build.gradle.tasks.PackageApplication"을 사용하십시오.

문제가 해결 될 것입니다.


나는 받아 들인 대답에 제시된 해결책을 시도했지만 그것은 효과가 없었습니다. 다른 사람에게 도움이 될 수있는 DID의 기능을 공유하고 싶었습니다. 이 솔루션을 여기 에서 찾았 습니다 .

Basically what you need to do is put your .so files inside a a folder named lib (Note: it is not libs and this is not a mistake). It should be in the same structure it should be in the APK file.

In my case it was:
Project:
|--lib:
|--|--armeabi:
|--|--|--.so files.

So I've made a lib folder and inside it an armeabi folder where I've inserted all the needed .so files. I then zipped the folder into a .zip (the structure inside the zip file is now lib/armeabi/*.so) I renamed the .zip file into armeabi.jar and added the line compile fileTree(dir: 'libs', include: '*.jar') into dependencies {} in the gradle's build file.

This solved my problem in a rather clean way.


To include native libraries you need:

  1. create "jar" file with special structure containing ".so" files;
  2. include that file in dependencies list.

To create jar file, use the following snippet:

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)
}

To include resulting file, paste the following line into "dependencies" section in "build.gradle" file:

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')

참고URL : https://stackoverflow.com/questions/16683775/include-so-library-in-apk-in-android-studio

반응형