首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中使用libpd

在Android中使用libpd
EN

Stack Overflow用户
提问于 2014-08-25 18:00:30
回答 5查看 3.2K关注 0票数 6

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

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

到目前为止,这对我来说是对的。我的应用程序的build.gradle包括库,我可以在我的MainActivity中导入PdDispatcher。问题是,它似乎仍然想念本地库(我认为!)。

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

代码语言:javascript
复制
PdAudio.initAudio(sampleRate, 0, 2, 8, true);

惨不忍睹

代码语言:javascript
复制
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)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-01-04 21:58:14

2016年1月17日更新的

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

有关帮助,请参阅pd- for -android的更新自述文件。

原已接受的答案:

启动和运行的最简单方法是将预构建的.so文件复制到: AmazingSynthesizer/src/main/jniLib 您将需要libpd.so和libpdnativeopensl.so来实现您所针对的体系结构,例如: AmazingSynthesizer/src/main/jniLibs/armeabi/libpd.so AmazingSynthesizer/src/main/jniLibs/armeabi/libpdnativeopensl.so

票数 7
EN

Stack Overflow用户

发布于 2015-03-28 17:01:13

更新日期: 03.07.2016

随着posts项目更新的新情况,我也更新了我的博客文章。请看这里:

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

样本项目:http://www.journal.deviantdev.com/sample-libpd-android-studio/

原始答案

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

  1. 获取Android
  2. GitHub下载pd-for-android
  3. 在Android中创建一个新项目
  4. 将AndroidMidi作为模块导入AndroidMidi
  5. 将PDCore作为模块导入Android
  6. 将AndroidMidi的依赖项添加到PDCore
  7. 向应用程序中添加PDCore的依赖项

现在你有两种可能的方法让它起作用。您可以使用NDK构建PdCore,并添加依赖项,也可以将jniLibs.srcDirs = 'src‘、’libs‘添加到PdCore build.gradle中。通常,您将选择第二种方式,除非默认情况下必须编译一些不随PdCore而来的外部程序。

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

祝好运!

票数 7
EN

Stack Overflow用户

发布于 2015-01-31 18:50:16

我也遇到了同样的问题,为了解决这个问题,我不得不告诉android插件jni文件(.so)在哪里:

代码语言:javascript
复制
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存储库构建的叉子中查看完整的build.gradle文件。我正在使用一个较新版本的Android插件,它在Android中运行得很好:

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

-更新自30.06.2015

我的pd-for-android叉子由@github/joebow比尔扩展,这样就可以改进gradle支持,并且可以使用gradle和Android创建.aar文件。因此,在创建使用纯数据的新Android项目时,不再需要复制pd for Android代码+二进制文件。对此更新的分叉应该很快合并到主分支的拉请求。在此之前,您可以从这里克隆这个叉子:

mods

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25491743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档