Использование libpd в Android Studio

Итак, я получил git-репозиторий с https://github.com/libpd/pd-for-android и создал новый пустой проект в Android Studio для моего "AmazingSynthesizer".

Я использовал мастер "Import Module" для импорта PdCore и AndroidMidi. Затем щелкните правой кнопкой мыши на "приложение", чтобы просмотреть мои "Настройки модуля". Под зависимостями я добавил PdCore как модуль зависимости. Также я добавил AndroidMidi в качестве модуля зависимости для "PdCore".

До сих пор это казалось правильным для меня. Build.gradle моего приложения включает в себя библиотеки, и я могу импортировать PdDispatcher в свой MainActivity. Проблема в том, что он все еще, кажется, скучает по родным библиотекам (я думаю!).

Очень простой пример кода из официальной книги libpd (Создание музыкальных приложений Питера Бринкмана)

PdAudio.initAudio(sampleRate, 0, 2, 8, true);

с треском проваливается

java.lang.UnsatisfiedLinkError: Couldn't load pd from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.app.amazingsynthesizer-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.app.amazingsynthesizer-1, /vendor/lib, /system/lib]]]: findLibrary returned null
        at java.lang.Runtime.loadLibrary(Runtime.java:358)
        at java.lang.System.loadLibrary(System.java:526)
        at org.puredata.core.PdBase.<clinit>(PdBase.java:55)
        at org.puredata.android.io.PdAudio.startAudio(PdAudio.java:86)
        at com.app.amazingsynthesizer.MainActivity.onResume(MainActivity.java:62)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
        at android.app.Activity.performResume(Activity.java:5310)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2764)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

5 ответов

Решение

[Обновлено 17.01.2016]

Теперь, когда артефакт библиотеки pd-for-android был опубликован в jCenter, самое простое решение стало еще проще: нет клонов, нет импорта; просто отредактируйте свой проект build.gradle файл и добавить зависимость компиляции на org.puredata.android:pd-core:1.0.0,

См. Обновленную версию README для pd-for-android.

Оригинал принятого ответа:

Самый простой способ начать работу - скопировать предварительно созданные файлы.so в:

AmazingSynthesizer / SRC / основные /jniLibs

Вам понадобятся libpd.so и libpdnativeopensl.so для архитектур, на которые вы ориентируетесь, например:

AmazingSynthesizer / src / main /jniLibs / armeabi / libpd.so AmazingSynthesizer / src / main /jniLibs / armeabi / libpdnativeopensl.so

[Обновлено 03.07.2016]

Наряду с новыми обстоятельствами, данными обновлением проекта pd-for-android, я также обновил свои записи в блоге. Посмотрите здесь:

Сообщение в блоге: http://www.journal.deviantdev.com/pure-data-for-android-jcenter-gradle-dependecy/

Пример проекта: http://www.journal.deviantdev.com/sample-libpd-android-studio/


[Оригинальный ответ]

В основном на этот вопрос отвечают по-разному, но я хочу добавить еще один ответ, чтобы поделиться своими мыслями. Я задокументировал и обновил различные способы запуска libpd с помощью android studio. Я подведу итог основных шагов:

  1. Получить Android Studio
  2. Скачать pd-для-андроид с GitHub
  3. Создать новый проект в Android Studio
  4. Импортировать AndroidMidi как модуль в Android Studio
  5. Импортировать PDCore как модуль в Android Studio
  6. Добавить зависимость для AndroidMidi в PDCore
  7. Добавьте зависимость для PDCore в ваше приложение

Теперь у вас есть два возможных способа заставить его работать. Вы можете собрать pd-for-android с помощью NDK и добавить зависимости, или вы можете добавить jniLibs.srcDirs = ['src', 'libs']"в build.gradle PdCore. Обычно вы выбираете второй способ, кроме случаев, когда у вас есть скомпилировать некоторые внешние компоненты, не поставляемые с pd-for-android по умолчанию.

Здесь вы можете найти несколько постов, содержащих более подробную информацию и пример проекта для Android Studio:

Удачи!

У меня была та же проблема, и чтобы исправить ее, я должен был сообщить плагину Android Gradle, где находятся файлы jni (.so):

android {

// omitted ...

  sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src', 'jni/libpd/java']
        resources.srcDirs = ['src', 'jni/libpd/java']
        aidl.srcDirs = ['src', 'jni/libpd/java']
        renderscript.srcDirs = ['src', 'jni/libpd/java']

        // ** this is what was missing **
        jniLibs.srcDirs = ['src', 'libs']

        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }
  }
}

Вы можете проверить полный файл build.gradle на развилке, которую я сделал из исходного репозитория libpd-for-android. Я использую более новую версию плагина Android gradle, и он прекрасно работает с Android Studio:

https://github.com/tkirshboim/pd-for-android/

- Обновление от 30.06.2015 -

Моя ветка pd-for-android была расширена @github/joebowbeer, так что улучшена поддержка gradle, и вы можете создать файл.aar, используя gradle и Android NDK. Поэтому больше нет необходимости копировать двоичные файлы pd-for-android + двоичные файлы при создании нового проекта Android, который использует чистые данные. Запрос на получение обновленного разветвления должен быть вскоре объединен с главной веткой. До этого вы можете клонировать эту вилку отсюда:

https://github.com/joebowbeer/pd-for-android/tree/gradle_mods

У меня пока недостаточно репутации, чтобы комментировать ответ @sdaau на этот вопрос, однако неправильно, что Android Studio не будет поддерживать NDK. NDK поддерживается в Android Studio начиная с версии 1.3. Вы можете скачать его здесь.

У меня была такая же проблема. Для краткости вы должны указать Gradle включить файлы *.so в качестве зависимости в вашем проекте (это не происходит автоматически).

Я смог решить свою проблему, глядя на этот ответ: /questions/41455132/vklyuchit-bibliotekuso-v-apk-v-android-studii/41455146#41455146 Я надеюсь, что это поможет.

РЕДАКТИРОВАТЬ: я забыл: я также должен был скомпилировать проект PdCore с ndk-build, Если вы получили ошибку относительно файлов в папке opensl_stream, убедитесь, что вы получили их правильно, так как они являются ссылкой на другое git-репо (я просто скопировал их вручную в мою папку... не лучшее решение, но это сработало)

ура

Благодаря ответу @kirsh300 я попал на более новую git репо libpd для Android, но все же процесс сборки не был тривиальным для меня. Поскольку это, вероятно, останется сложным (см. Android Studio "Текущая поддержка NDK устарела"), ниже приведен скрипт bash того, что я должен был сделать, чтобы получить libpd для Android, чтобы построить на моей старой коробке Linux.

Первая проблема заключается в том, что моя установка находится в нестандартных каталогах. Затем я использовал SDK из старой Android Studio Bundle для Linux, 135.1078000 (от 20140321); этот по умолчанию максимально соответствует API 19; и не устанавливает другие API по умолчанию. Тем не менее, текущий пересмотр libpd относится как к API 17, так и к API 21. API 17 я установил вручную, вызвав команду $ANDROID_HOME/tools/android, который является Android SDK Manager - в то время как API 21 я снизил до 19, исправив файлы в приведенном ниже скрипте. Итак, мой Android SDK manager показывает для установленного:

sdk.png

Вторая проблема заключается в том, что с этим SDK приходит gradlew которая является версией 1.10 - в то время как текущая версия gradlew проверил в libpd репо 2.4 (при первом вызове он попытается загрузить gradle версия). Помните, чтобы не называть gradlew из SDK - потому что тот не понимает, скажем, android.ndkDirectory ("Не удалось найти свойство" ndkDirectory "на com.android.build.gradle.LibraryExtension_Decorated@3e3c83"), или variant.outputs.each ("Не удалось найти выходные свойства" в конструкциях com.android.build.gradle.internal.api.LibraryVariantImpl_Decorated@97447e") в build.gradle сценарии - таким образом gradlew 2.4 из репо следует использовать (отсюда и относительный путь в скрипте).

Вот сценарий:

#!/usr/bin/env bash

# wget http://dl.google.com/android/studio/install/0.5.2/android-studio-bundle-135.1078000-linux.tgz
# wget http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86.bin
# unpack downloads - and modify these to your actual absolute paths (also for JAVA_HOME below):
ADTSDK=/path/to/adt-bundle-linux-x86-20140321/sdk
ADNDK=/path/to/android-ndk-r10e
# these seem to not really matter? nvm, keep:
export ANDROID_HOME=$ADTSDK
export ANDROID_NDK_HOME=$ADNDK

set -x

# only run if the subdirectory pd-for-android not created yet:
if [ ! -d "pd-for-android" ]; then
  #git clone https://github.com/libpd/pd-for-android.git # no, OLD!
  git clone https://github.com/tkirshboim/pd-for-android.git
  cd pd-for-android
  # checkout specific version to make sure this test works when the repo changes:
  git checkout -f c5ea734c5aac7f2d37141e287bd0102706d54e55
  # create root/top-level local.properties, esp. for sdk.dir:
  echo "ndk.dir=$ADNDK" > local.properties 
  echo "sdk.dir=$ADTSDK" >> local.properties
  # downgrade API version:
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' PdTest/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' PdTest/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" PdTest/build.gradle
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' CircleOfFifths/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' CircleOfFifths/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" CircleOfFifths/build.gradle
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' ScenePlayer/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' ScenePlayer/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" ScenePlayer/build.gradle
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' Voice-O-Rama/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' Voice-O-Rama/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" Voice-O-Rama/build.gradle
  cd PdCore
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' build.gradle
  sed -i "s_buildToolsVersion '21.1.2'_buildToolsVersion '19.1' //'21.1.2'_" build.gradle # The SDK Build Tools revision (19.0.3) is too low for project ':PdCore'. Minimum required is 19.1.0 - install via Android SDK manager
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" build.gradle
  # check if tasks pass:
  ../gradlew tasks || { echo 'tasks failed' ; exit 1; } # pulls gradle-2.4-all.zip;
  # build:
  # must specify JAVA_HOME here, else "FAILURE: Build failed ... Could not find tools.jar"
  JAVA_HOME=/path/to/jdk1.6.0_45 ../gradlew assembleRelease 
  cd ../..
fi
Другие вопросы по тегам