2016-02-24 1 views
10

Я пытаюсь добавить собственную сборную общую библиотеку в мой проект в Android Studio. Я использую gradle-experimental: 0.6.0-alpha5. Тем не менее, всякий раз, когда я пытаюсь добавить скомпилированную общую библиотеку к моей модели приложения, я получаю следующее сообщение об ошибке:Собственная предварительно созданная общая библиотека в Android Studio с экспериментальным плагином Gradle

Error:Cause: org.gradle.api.internal.PolymorphicDomainObjectContainerConfigureDelegate

библиотека добавляется в модель приложения, как это описывается Google Gradle Experimental Guide:

repositories { 
    prebuilt(PrebuiltLibraries) { 
     binaries.withType(SharedLibraryBinary) { 
      sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "shared_lib" 
      } 
     } 
    } 
} 

Важнейшей линией является библиотека "shared_lib". Нет ошибки, если я раскомментирую эту строку.

Так как это не работает, я также попытался использовать руководство от ph0b.com. Они используют другой синтаксис для добавления нативных разделяемых библиотек (я только что вышел из заголовков, так как у меня нет ни одного каталога, включая все заголовки):

repositories { 
    libs(PrebuiltLibraries) { 
     shared_lib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("/path_to_libs/${targetPlatform.getName()}/shared_lib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jni { 
      dependencies { 
       library "shared_lib" linkage "shared" 
      } 
     } 
    } 
} 

Тем не менее, это не работает, как хорошо. Android Studio не копирует файл shared_lib в файл apk. Следовательно, я всегда получаю следующее сообщение об ошибке:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader [...] couldn't find "shared_lib.so"

Может ли кто-нибудь сказать мне, как я могу включить библиотеку исходной библиотеки в мой проект? Я использую buildToolsVersion = '22 .0.1 ' и compileSdkVersion = 22 как параметры сборки.

+0

Возможно, вы можете попробовать с жестко закодированным путем .so вместо '$ {targetPlatform.getName()}'? – RaGe

+0

Да, я уже это пробовал. Gradle может определенно разрешить путь, так как я получаю сообщение об ошибке, если я изменю путь к несуществующему файлу. Я все равно был бы рад, если будет решение моей проблемы. Тем не менее, я временно решил свою проблему, не используя ранее созданные библиотеки. Я добавил все необходимые файлы заголовков с помощью 'cppFlags.add (" - I $ {file ("./../../../ projects/test/include")} ". ToString())' и cpp файлы с 'srcDirs + =" ./../../../ projects/test/src/"' to jni. Но было бы лучше иметь возможность использовать предварительно созданные библиотеки. – budderick

+0

вы могли бы запустить с '--stacktrace' и захватить больше ошибок? – RaGe

ответ

7

Это работало для меня (0.6.0-beta6).

repositories { 
    prebuilt(PrebuiltLibraries) { 
     YourLib { 
      binaries.withType(SharedLibraryBinary) { 
       sharedLibraryFile = file("src/main/libs/armeabi-v7a/libYourLib.so") 
      } 
     } 
    } 
} 

android.sources { 
    main { 
     jniLibs { 
      dependencies { 
       library "YourLib" 
      } 
     } 
    } 
} 

Похоже, они просто забыли упомянуть "YOURLIB {}" часть вокруг "binaries.withType".

+0

Спасибо, это работает для меня на gradle-experimental: 0.6.0 – Xuelong

+0

Я отмечу это как решение общей проблемы. Синтаксис @Zhur является правильным. Тем не менее, я думаю, что UnsatisfiedLinkError является более сложной ошибкой, которая в основном не имеет ничего общего с файлом Gradle. – budderick

+0

@budderick Он имеет: из-за неправильного файла Gradle общая библиотека не попадает в APK. Таким образом, во время выполнения компоновщик не может найти эту библиотеку и выбрасывает исключение. – zhur

Смежные вопросы