在dalvikvm中使用AudioTrack触发UnsatisfiedLinkError问题求助
解决DalvikVM环境下AudioTrack触发的UnsatisfiedLinkError问题
我来帮你拆解下这个问题的根源,以及对应的解决办法:
首先,你遇到的UnsatisfiedLinkError本质是AudioTrack作为Android系统组件,依赖底层的JNI本地库,但直接用dalvikvm运行测试类时,虚拟机没有自动加载这些必要的本地库——而app_process环境会自动初始化系统组件的依赖加载逻辑,所以在那个场景下不会出问题。
下面是具体的排查和修复步骤:
1. 手动加载依赖的JNI本地库
在测试代码开头显式加载AudioTrack需要的核心本地库,修改后的代码如下:
package android.media; class Hello { public static void main(String[] args) { // 先加载AudioTrack依赖的JNI库,不同Android版本库名可能略有差异 System.loadLibrary("media_jni"); System.loadLibrary("audioflinger"); AudioAttributes aa = new AudioAttributes.Builder().build(); AudioFormat af = new AudioFormat.Builder().build(); AudioTrack at = new AudioTrack(aa, af, 4, 1, 0); at.release(); } }
重新编译成dex后再运行,如果加载失败,可以去设备的/system/lib或/system/lib64目录下查看media相关的库文件,确认准确的库名称。
2. 配置DalvikVM的运行环境参数
直接用dalvikvm运行时,可能缺少系统framework的类路径或库路径配置,你可以尝试添加这些参数:
# 加入系统framework的类路径 /system/bin/dalvikvm -cp /system/framework/framework.jar:android.dex android.media.Hello
或者同时指定系统库的加载路径:
LD_LIBRARY_PATH=/system/lib:/system/lib64 /system/bin/dalvikvm -cp /system/framework/framework.jar:android.dex android.media.Hello
3. 验证构造参数的合法性(可选)
虽然当前报错是链接问题,但也可以顺便确认下AudioTrack的构造参数是否合理——比如你传入的缓冲区大小4和模式1,要确保这些值在当前设备上是有效的。不过这一步建议在解决链接错误之后再验证。
4. 参考app_process的运行逻辑
app_process启动时会自动完成系统组件的初始化,包括加载media相关的JNI库,所以在那个环境下你的代码能正常运行。如果要在dalvikvm下模拟类似环境,除了手动加载库,还可以尝试初始化系统的ActivityThread相关逻辑(不过这个复杂度较高,优先尝试前两个方法)。
内容的提问来源于stack exchange,提问作者Tom Yan
相关产品推荐
相关产品推荐

