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
相关产品推荐
相关产品推荐

