안드로이드 스튜디오에서 APK에 .so 라이브러리 포함
이 질문에는 이미 답변이 있습니다.
- 안드로이드 스튜디오, gradle 및 NDK 23 답변
내부적으로 .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:
- create "jar" file with special structure containing ".so" files;
- 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
'IT story' 카테고리의 다른 글
'int'와 'int'사이에 암시 적 변환이 없으므로 조건식의 유형을 확인할 수 없습니다. (0) | 2020.06.22 |
---|---|
사용자 정의 리터럴은 C ++에 어떤 새로운 기능을 추가합니까? (0) | 2020.06.22 |
C #에서 문자열에서 함수 호출 (0) | 2020.06.22 |
효과와 함께 추가를 사용하여 jQuery (0) | 2020.06.22 |
gitosis 대 gitolite? (0) | 2020.06.22 |