Java &引用;JNI错误:GetStringUTFChars收到空jstring";调用MediaCodec.configure()时
我想从*.mp3文件中获取原始数据。我发现这对我来说很好,但我Java &引用;JNI错误:GetStringUTFChars收到空jstring";调用MediaCodec.configure()时,java,android,java-native-interface,android-mediacodec,Java,Android,Java Native Interface,Android Mediacodec,我想从*.mp3文件中获取原始数据。我发现这对我来说很好,但我 A/64.myproj: java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring java_vm_ext.cc:542] in call to GetStringUTFChars java_vm_ext.cc:542] from void android.media.M
A/64.myproj: java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: GetStringUTFChars received NULL jstring
java_vm_ext.cc:542] in call to GetStringUTFChars
java_vm_ext.cc:542] from void android.media.MediaCodec.native_configure(java.lang.String[], java.lang.Object[], android.view.Surface, android.media.MediaCrypto, android.os.IHwBinder, int)
java_vm_ext.cc:542] "main" prio=5 tid=1 Runnable
java_vm_ext.cc:542] | group="main" sCount=0 dsCount=0 flags=0 obj=0x74071ee0 self=0xed774000
java_vm_ext.cc:542] | sysTid=1552 nice=-10 cgrp=default sched=0/0 handle=0xf2463494
java_vm_ext.cc:542] | state=R schedstat=( 993990291 519274343 1413 ) utm=70 stm=29 core=1 HZ=100
java_vm_ext.cc:542] | stack=0xff31c000-0xff31e000 stackSize=8MB
在mediaCodec.configure上配置(mediaFormat,null,null,0)
代码如下:
public static void foo(String filepath) throws IOException {
MediaExtractor mediaExtractor = new MediaExtractor();
mediaExtractor.setDataSource(filepath);
MediaFormat mediaFormat = mediaExtractor.getTrackFormat(0);
mediaExtractor.release();
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(filepath);
final long durationMs = Long.parseLong(mmr.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_DURATION));
mmr.release();
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
mediaFormat.setString(MediaFormat.KEY_FRAME_RATE, null);
String codecName = mediaCodecList.findDecoderForFormat(mediaFormat);
MediaCodec mediaCodec = MediaCodec.createByCodecName(codecName);
mediaCodec.setCallback(new MediaCodec.Callback() {
@Override
public void onInputBufferAvailable(MediaCodec codec, int index) {
File file = new File(filepath);
int size = (int) file.length();
byte[] bytes = new byte[size];
ByteBuffer in = codec.getInputBuffer(index);
try (BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file))) {
buf.read(bytes, 0, bytes.length);
in.put(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
codec.queueInputBuffer(
index,
0,
size,
durationMs * 1000L,
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
}
@Override
public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {
ByteBuffer out = codec.getOutputBuffer(index);
short buf[] = out.asShortBuffer().array();
}
@Override
public void onError(MediaCodec codec, MediaCodec.CodecException e) {}
@Override
public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {}
});
mediaCodec.configure(mediaFormat, null, null, 0);
mediaCodec.start();
}
和。findDecoderForFormat的文档说明,如果未找到此类编解码器,则返回“null”。同时,
createByCodeName
的文档中说,传递给它的名称“决不能为空”。因此,显然您必须处理该场景。mediaFormat.setString(mediaFormat.KEY\u FRAME\u RATE,null)代码>可能是问题所在。只是不要设置它,这通常是不必要的。由于未正确处理null
值,可能仍然是制造商的错误。你在用什么设备?@Michael,是的,但目前还没有问题-MediaCodec创建正确,它会抛出NullPointerException
或者something@ChrisBe,我试过了,没有改变。顺便说一句,它本身已经有了null
:)我正在使用Android Studio的模拟器-Nexus 5X API 28hm,帧速率仍然为null,这可能是崩溃的原因。您是否尝试将其设置为实际值?试试25,你可能希望它会被MediaCode忽略。findDecoderForFormat
的文档说它返回“如果没有找到这样的编解码器,则返回null”。同时,createByCodeName
的文档中说,传递给它的名称“决不能为空”。因此,显然您必须处理该场景。mediaFormat.setString(mediaFormat.KEY\u FRAME\u RATE,null)代码>可能是问题所在。只是不要设置它,这通常是不必要的。由于未正确处理null
值,可能仍然是制造商的错误。你在用什么设备?@Michael,是的,但目前还没有问题-MediaCodec创建正确,它会抛出NullPointerException
或者something@ChrisBe,我试过了,没有改变。顺便说一句,它本身已经有了null
:)我正在使用Android Studio的模拟器-Nexus 5X API 28hm,帧速率仍然为null,这可能是崩溃的原因。您是否尝试将其设置为实际值?试试25,你可能希望它被mediacodec忽略