在Android Studio中使用libpd

时间:2014-08-25 18:00:30

标签: android android-studio libpd

所以我从https://github.com/libpd/pd-for-android获得了git repo,并在Android Studio中为我的“AmazingSynthesizer”创建了一个新的空白项目。

我使用“导入模块”向导导入PdCore和AndroidMidi。然后,右键单击“app”查看我的“模块设置”。在依赖项下,我添加了PdCore作为模块依赖项。另外,我添加了AndroidMidi作为“PdCore”的模块依赖。

到目前为止,这对我来说似乎是正确的。我的应用程序的build.gradle包含库,我可以在MainActivity中导入PdDispatcher。问题是,它似乎仍然错过了本机库(我想!)。

来自官方libpd书籍(由Peter Brinkmann制作音乐应用程序)的基本示例代码

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 个答案:

答案 0 :(得分:7)

[2016年1月17日更新]

既然已将pd-for-android库工件发布到jCenter,最简单的解决方案变得更简单:没有克隆,没有导入;只需编辑项目的build.gradle文件,并在org.puredata.android:pd-core:1.0.0上添加编译依赖项。

请参阅pd-for-android的更新README以获取帮助。

原来接受的答案:

  

启动和运行的最简单方法是复制预构建的.so   文件到:

     

AmazingSynthesizer / SRC /主/ jniLibs

     

您需要libpd.so和libpdnativeopensl.so作为架构   您要定位的目标,例如:

     

AmazingSynthesizer / SRC /主/ jniLibs / armeabi / libpd.so   AmazingSynthesizer / SRC /主/ jniLibs / armeabi / libpdnativeopensl.so

答案 1 :(得分:7)

[2016年7月3日更新]

除了pd-for-android项目更新给出的新情况外,我还更新了我的博文。看看这里:

博文:http://www.journal.deviantdev.com/pure-data-for-android-jcenter-gradle-dependecy/

示例项目:http://www.journal.deviantdev.com/sample-libpd-android-studio/


[原始答案]

基本上这个问题以不同的方式回答,但我想添加另一个答案来分享我的想法。我记录并更新了如何使用android studio运行libpd的不同方法。我将总结基本步骤:

  1. 获取Android Studio
  2. GitHub
  3. 下载pd-for-android
  4. 在Android Studio中创建新项目
  5. 将AndroidMidi作为模块导入Android Studio
  6. 将PDCore作为模块导入Android Studio
  7. 将AndroidMidi的依赖项添加到PDCore
  8. 将PDCore的依赖项添加到您的应用
  9. 现在你有两种可能的方法让它运转起来。您可以使用NDK构建pd-for-android并添加依赖项,或者您可以将jniLibs.srcDirs = ['src','libs']“添加到PdCore build.gradle。通常您将选择第二种方式,除非您有编译一些默认情况下没有附带pd-for-android的外部组件。

    在这里,您可以找到一些帖子,为Android Studio提供更多详细信息和示例项目:

    祝你好运!

答案 2 :(得分:3)

我有同样的问题并修复它我必须告诉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']
    }
  }
}

您可以在原始libpd-for-android存储库的fork中查看完整的build.gradle 文件。我正在使用更新版本的Android gradle插件,它适用于Android Studio:

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

- 2015年6月30日更新 -

我的pd-for-android fork由@ github / joebowbeer扩展,以便改进gradle支持,你可以使用gradle和Android NDK创建一个.aar文件。因此,在创建使用纯数据的新Android项目时,不再需要复制pd-for-android代码+二进制文件。此更新分叉should be merged soon to the master branch的拉取请求。在此之前,你可以从这里克隆这个分支:

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

我还没有足够的声誉来评论@sdaau对此问题的回答,但Android Studio不支持NDK是不正确的。 Android version 1.3 onwards支持NDK。您可以从here下载。

答案 3 :(得分:2)

我遇到了同样的问题。为了简化,你必须指示gradle在项目中包含* .so文件作为依赖项(它不会自动发生)

我能够解决我的问题,看看这个答案:https://stackoverflow.com/a/17974618 我希望它有所帮助。

编辑:我忘记了:我还必须使用ndk-build编译PdCore项目。如果你收到有关文件夹opensl_stream中的文件的错误,请确保你正确使用它们,因为它们是另一个git仓库的链接(我只是将它们手动复制到我的文件夹......不是最好的解决方案,但它有效)

干杯

答案 4 :(得分:0)

感谢@kirsh300的回答,我为Android获得了git libpdlibpd的回购,但是构建过程对我来说并不是一件轻而易举的事。由于这可能仍然很复杂(参见Android Studio "Current NDK support is deprecated"),下面是我必须做的bash脚本,以便在我的旧Linux机器上构建用于Android的libpd

第一个问题是我的安装是在非标准目录中。然后,我使用了旧的(呃)Android Studio Bundle for Linux,135.1078000(来自20140321)的SDK;默认情况下,这个最大值为API 19;并且默认情况下不安装其他API。但是,当前版本的$ANDROID_HOME/tools/android指的是API 17和API 21. API 17我通过调用命令gradlew手动安装,这是Android SDK Manager - 而API 21我降级为19通过在下面的脚本中修补文件。所以,我的Android SDK管理器显示已安装:

sdk.png

第二个问题是,使用此SDK时,会出现gradlew版本1.10 - 而在libpd回购中检查的2.4的当前版本为gradle(首次调用时,它将尝试下载正确的gradlew版本)。要记住的是,不要从SDK调用android.ndkDirectory - 因为那个人不明白,比如说,variant.outputs.each(“无法在com.android上找到属性'ndkDirectory' .build.gradle.LibraryExtension_Decorated @ 3e3c83 “)或build.gradle(”无法在com.android.build.gradle.internal.api.LibraryVariantImpl_Decorated@97447e找到属性'输出'< / em>“)gradlew脚本中的构造 - 因此应该使用来自repo的#!/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 2.4(因此脚本中的相对路径)。

这是脚本:

Uncaught TypeError: Cannot read property 'Imagedes' of undefinedmoveLeft @ ShowcaseWebsiteTest.html:257(anonymous function) @ ShowcaseWebsiteTest.html:277m.event.dispatch @ jquery-latest.min.js:3m.event.add.r.handle @ jquery-latest.min.js:3