У меня есть libs jar и *.so. Я создал проект Eclipse, как в учебнике (для этого libs). Теперь я делаю проект в Android Studio, но система не может найти файлы *.so. Я делаю, как в этом - Включить .so библиотеку в apk в android studio. Мое приложение не находит функцию в таких библиотеках. Как их найти? Журнал:
10-16 12:16:55.965: W/dalvikvm(4386): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/atol/drivers/fptr/IFptrNative;
10-16 12:16:55.965: W/dalvikvm(4386): threadid=1: thread exiting with uncaught exception (group=0x41869438)
10-16 12:16:55.976: E/AndroidRuntime(4386): FATAL EXCEPTION: main
10-16 12:16:55.976: E/AndroidRuntime(4386): java.lang.ExceptionInInitializerError
При создании объекта с использованием библиотеки JAR возникает ошибка. Она, в свою очередь, ткнула *.so файлы, но чтобы найти то, что ей нужно. Кто виноват и что делать?
Три варианта:
Один
Скопируйте свои библиотеки *.SO в папку libs
и поместите их в Build.gradle
:
dependencies
{
compile fileTree(include: ['*.jar'], dir: 'libs')
}
Два
Создайте новую папку в src/main/jniLibs
и запишите ее в свой Build.gradle
:
android {
//Another code
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jnilibs']
}
//Another code
}//sourceSets tag close
}//Android tag close
Там
Создайте новую папку в src/main/jniLibs
и запишите ее в свой Build.gradle
:
//Another code....
dependencies
{
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}//end dependencies
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'src/main/jnilibs', include: '**/*.so')
into 'lib/'
}
tasks.withType(JavaCompile)
{
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
Текущее решение
Создайте проект папки /app/src/main/jniLibs, а затем поместите ваши файлы *.so в свои папки abi в этом месте. Например.
project/
├──libs/
| └── *.jar <-- if your library has jar files, they go here
├──src/
└── main/
├── AndroidManifest.xml
├── java/
└── jniLibs/
├── arm64-v8a/ <-- ARM 64bit
│ └── yourlib.so
├── armeabi-v7a/ <-- ARM 32bit
│ └── yourlib.so
└── x86/ <-- Intel 32bit
└── yourlib.so
Устаревшее решение
Добавьте оба фрагмента кода в свой файл gradle.build в качестве зависимости:
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
How to create this custom jar:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
Создайте имя папки "jniLibs" внутри src/main folder и добавьте все папки, содержащие ваш файл "*.so", и синхронизируйте и запустите приложение. Никаких других шагов не требуется.
Вам нужно поместить ваши файлы .so в папку с именем lib (это не libs и должно быть lib). Он должен быть в той же структуре, что и в файле APK.
Структура
Project:
|--lib:
|--|--armeabi:
|--|--|--.so files.
Затем папка armeabi, в которую вставляются все .so
файлы. Затем запишите папку в .zip.Rename.zip файл в armeabi.jar и добавьте строку
compile fileTree(dir: 'libs', include: '*.jar')
в dependencies {}
в файле сборки gradle.
Для получения дополнительной информации и альтернативного метода см. Этот ответ и Этот ответ