NDK: как включить * .so файлы в AndroidStudio

1

У меня есть 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 файлы, но чтобы найти то, что ей нужно. Кто виноват и что делать?

Теги:
android-studio
android-ndk

4 ответа

5
Лучший ответ

Три варианта:

Один

Скопируйте свои библиотеки *.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)
     }
  • 0
    Не работает. Я создаю объект, используя библиотеку JAR, но он работает .so библиотеки. В Eclipse все работает. Может ли AndroidStudio генерировать неверные ссылки .so библиотеки или библиотеки JAR-файлов, связанные со структурой проекта в Eclipse?
  • 0
    второй вариант сработал для меня.
Показать ещё 3 комментария
2

Текущее решение

Создайте проект папки /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)
}


0

Создайте имя папки "jniLibs" внутри src/main folder и добавьте все папки, содержащие ваш файл "*.so", и синхронизируйте и запустите приложение. Никаких других шагов не требуется.

  • 0
    не работает таким образом
0

Вам нужно поместить ваши файлы .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.

Для получения дополнительной информации и альтернативного метода см. Этот ответ и Этот ответ

  • 0
    Не работает. Я создаю объект, используя библиотеку JAR, но он работает .so библиотеки. В Eclipse все работает. Может ли AndroidStudio генерировать неверные ссылки .so библиотеки или библиотеки JAR-файлов, связанные со структурой проекта в Eclipse?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню