You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中调用Visualizer.getFft触发JNI空数组错误的问题求助

问题分析

从错误日志JNI DETECTED ERROR IN APPLICATION: jarray was NULL可直接定位核心问题:调用audioVisualizer.getFft(fft)时,传入的fft字节数组是未初始化的空值,JNI层调用GetPrimitiveArrayCritical时因空数组触发崩溃。

解决方案

1. 正确初始化FFT数组

Visualizer.getFft()要求传入的数组长度至少等于Visualizer.getCaptureSize()的返回值(FFT数据以字节形式存储,每个频率点包含实部和虚部各1字节)。修正后的初始化代码如下:

audioVisualizer = new AudioVisualizer(audioSessionId);
// 获取默认捕获大小,也可自定义(需为2的幂次,如1024、2048)
int captureSize = audioVisualizer.getCaptureSize();
// 初始化FFT数组,长度匹配捕获大小
byte[] fft = new byte[captureSize];
audioVisualizer.setEnabled(true);
try {
    int a = audioVisualizer.getFft(fft);
} catch (Exception e) {
    e.printStackTrace();
}

2. 验证AudioSessionId有效性

确保audioSessionId是当前正在播放音频的有效会话ID,比如从MediaPlayer或AudioTrack获取:

// 示例:从MediaPlayer获取有效SessionId
MediaPlayer mediaPlayer = ...;
int audioSessionId = mediaPlayer.getAudioSessionId();
// 注意:不要传入0,0代表默认音频输出,部分设备不支持

3. 确保权限齐全

使用Visualizer必须声明RECORD_AUDIO权限,Android 6.0及以上需动态申请:

  • 清单文件添加:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
  • 动态申请代码:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_CODE);
}

4. 额外注意事项

  • 调用getFft()前必须确保Visualizer已启用(setEnabled(true)),且状态正常。
  • 若需自定义捕获大小,需在setEnabled(true)之前通过setCaptureSize(int)设置,且值必须为2的幂次。

内容的提问来源于stack exchange,提问作者Orest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:31:04