6

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

我使用“导入模块”向导导入 PdCore 和 AndroidMidi。然后,右键单击“应用程序”以查看我的“模块设置”。在依赖项下,我将 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)
4

5 回答 5

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下载 pd-for-android
  3. 在 Android Studio 中创建一个新项目
  4. 将 AndroidMidi 作为模块导入 Android Studio
  5. 将 PDCore 作为模块导入 Android Studio
  6. 将 AndroidMidi 的依赖项添加到 PDCore
  7. 将 PDCore 的依赖项添加到您的应用程序

现在你有两种可能的方法来让它工作。您可以使用 NDK 构建 pd-for-android 并添加依赖项,也可以将 jniLibs.srcDirs = ['src', 'libs']" 添加到 PdCore build.gradle。通常您会选择第二种方式,除非您有编译一些默认情况下不附带 pd-for-android 的外部。

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

祝你好运!

于 2015-03-28T17:01:13.460 回答
7

[2016 年 1 月 17 日更新]

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

请参阅 pd-for-android 的更新自述文件以获取帮助。

原始接受的答案:

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

惊人的合成器/src/main/jniLibs

对于您所针对的架构,您需要 libpd.so 和 libpdnativeopensl.so,例如:

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

于 2015-01-04T21:58:14.407 回答
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 代码 + 二进制文件。这个更新的分支的拉取请求应该很快合并到主分支。在那之前,你可以从这里克隆这个 fork:

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

我还没有足够的声誉来评论@sdaau对这个问题的回答,但是 Android Studio 不支持 NDK 是不正确的。Android Studio 从1.3 版开始支持 NDK 。你可以从这里下载。

于 2015-01-31T18:50:16.757 回答
2

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

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

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

干杯

于 2014-09-07T21:18:07.107 回答
0

感谢@kirsh300的回答,我得到了一个更新gitlibpdAndroid 存储库,但构建过程对我来说仍然不是微不足道的。由于这可能仍然很复杂(请参阅Android Studio "Current NDK support is deprecated"),下面是我必须做的一个 bash 脚本,以便让libpdAndroid 在我的旧 Linux 机器上构建。

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

sdk.png

第二个问题是,使用这个 SDK,有一个gradlew1.10 版本 - 而在repo中gradlew检查的当前版本是(在第一次调用时,它将尝试下载正确的版本)。要记住的是,不要从 SDK 调用 - 因为那个人不理解,比如说(“在 com.android.build.gradle.LibraryExtension_Decorated@3e3c83 上找不到属性 'ndkDirectory' ”),或者( “在 com.android.build.gradle.internal.api.LibraryVariantImpl_Decorated@97447e 上找不到属性 'outputs' ”)脚本中的构造 - 因此应该使用来自 repo 的 2.4(因此脚本中的相对路径)。libpd2.4gradlegradlewandroid.ndkDirectoryvariant.outputs.eachbuild.gradlegradlew

这是脚本:

#!/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
于 2015-07-24T17:14:00.697 回答