【问题标题】:Android Libpd not working - error: ... couldn't createAndroid Libpd 不工作 - 错误:...无法创建
【发布时间】:2016-05-31 02:14:45
【问题描述】:

我的客户提供了一个 .so 预构建的共享库。应该使用 libpd 加载,因为 libpd 控制器需要加载 m4aPlayer 模块。所以我把 libm4aPlayer.so 放在 app > main 下的 jniLibs(也试过 libs)文件夹中,然后我在 build.gradle 中添加了这个

defaultConfig {
        ndk{
            moduleName "m4aPlayer"
        }
    }
    ...

sourceSets {
        main {
            jni {
                srcDirs = []
            }
            jniLibs {
                srcDir 'libs'
            }
        }
    }

然后在我的 AudioService 类(我在其中 initPd() 和 loadPatch())中,我试图调用客户端通过这样做提供的本机预构建库

patchFile = new File(pdFile[0].mFile.getParent(), "pd/_main.pd");

//System.loadLibrary("pd");
System.loadLibrary("m4aPlayer");

PdBase.openPatch(patchFile);
PdBase.sendFloat("fadeTime", 12f);

每次我尝试打开补丁文件(_main.pd)时,我都会从 PD 控制器收到错误消息,提示“m4aPlayer 无法创建”。但我试图加载库仍然 pd 抛出这个错误。 它可以很好地播放其他音频(libpd 不需要 m4aPlayer 胶水。)

堆栈跟踪

05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print: m4aPlayer
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print: error: ... couldn't create
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.840 6589-6589/com.test.test I/PdUiDispatcher: print: m4aPlayer
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: error: ... couldn't create
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: m4aPlayer
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: error: ... couldn't create
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: fadeTime: 12
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: fadeDelay: 3
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: curve: 30
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: musicVol: 1.5
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: voiceVol: 1.5
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: voiceGender: 1
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: isRandom: 1
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: suggestionsVO: 1
05-30 21:48:05.841 6589-6589/com.test.test I/PdUiDispatcher: print: availableSoundscapes:
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 2
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 3
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 4
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 5
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 6
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 7
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 8
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print:  
05-30 21:48:05.842 6589-6589/com.test.test I/PdUiDispatcher: print: 9
05-30 21:48:05.843 6589-6589/com.test.test I/PdUiDispatcher: print: 
05-30 21:48:05.843 6589-6589/com.test.test I/PdUiDispatcher: print: module: 2
05-30 21:48:05.843 6589-6589/com.test.test I/PdUiDispatcher: print: INTO-Q: 0
05-30 21:48:05.843 6589-6589/com.test.test I/PdUiDispatcher: print: soundscape: 5
05-30 21:48:05.843 6589-6589/com.test.test I/PdUiDispatcher: print: toApp-isThisFileOK: p5intro0

我还尝试检查应用程序内部,以确保库是否被复制。于是我去了

data/data/package_name/lib

【问题讨论】:

  • 我假设您尝试使用的 .so 文件是纯数据外部文件?在这种情况下 - 您可以从客户端获取源并将其构建为外部的,如 pd-for-android README 中所述,而不是绑定 .so 文件?补丁是否在纯数据原版的桌面版上正确加载?
  • @kirsh300 - 是的 libm4aPlayer.so 是一个纯数据外部,我的 app>main>jni 目录中有它。一旦我尝试使用 ndk-build 命令进行构建。我还能够生成 .so 文件(即使客户端已经提供了预构建的 .so 文件)并尝试加载该 .so 文件,但这也失败了。每次我尝试调用 _main.pd 时,它都会查找应该在运行时加载的 m4aPlayer 模块,这就是我使用 System.loadLibrary("m4aPlayer") 加载它的原因。
  • 能否提供需要m4aPlayer的补丁sn-p?

标签: android java-native-interface shared-libraries .so libpd


【解决方案1】:

您不需要调用 System.loadLibrary() 来加载纯数据外部。

查看 pd-for-android 存储库中的 PdTest example,作为“helloworld.c”外部如何在此处使用的参考。您可以将其用作您自己项目的模板,以使事情一开始就简单,并验证纯数据补丁可以正确加载您的 libm4aPlayer 外部。

另外,您提到的是 .m 文件。我猜你正在编译Objective C?我还没有看到有人用 pd-for-android 这样做,所以我不确定这是否可行。

【讨论】:

  • 嘿,我正在尝试我能想到的一切。所以我也尝试了 .h/.m 文件。只是看看它是否有效。客户提供了一个预建的 libm4aPlayer.so 库,并告诉我们需要将其打包在 apk 中。查看设备屏幕截图,确认它正在复制 apk 中的 .so。但是当我阅读 _main.pd(主音频控制器)时,我马上就得到了那个错误。
【解决方案2】:

这个答案可能会提供一些线索或提示:https://stackoverflow.com/a/27523384/901597

【讨论】:

    【解决方案3】:

    有三个选项:

    • pd 找不到库文件:尝试使用完整路径(或确认可以加载其他外部文件,如 [bonk~]

    • 二进制文件遗漏了一些依赖项(检查一些与ldd 等效的android)

    • 二进制文件根本不是 Pd 外部文件(尽管您的客户声称是这样)

    要调试最后两个选项,您可能需要提高详细程度和/或监控应用程序的标准错误(可能还有标准输出)。

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2015-06-04
      相关资源
      最近更新 更多