gpt4 book ai didi

java - 从 native 代码的回调中写入 AudioTrack 实例时出现 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 15:30:48 25 4
gpt4 key购买 nike

我在 native 代码中执行一些解码过程,并从中调用 Java 方法以将样本写入 AudioTrack 实例。解码过程运行正常,从native代码到Java的回调:

private void writeToAudioTrack(final byte[] buffer)

被调用,但是一旦 Runnable 对象开始将样本写入 AudioTrack,我会立即收到 NullPointerException。我很确定这是由错误的线程引起的,但无法弄清楚那里出了什么问题。我附上完整的Java代码:

public class Player
{
private AudioTrack track;
private boolean isInitialized = false;
private static Handler handler = new Handler();

public void init(String mediaSource)
{
// Call native function initEngine
isInitialized = initEngine(mediaSource);

if (isInitialized)
{
int bufSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM);
track.play();
}
}

public void play()
{
// Call native rendering function in a separate thread
if (isInitialized)
{
new Thread(new Runnable()
{
@Override
public void run()
{
renderAudio();
}
}).start();
}
}

public void release()
{
isInitialized = false;
releaseEngine();
}

// This is callback from native code
private void writeToAudioTrack(final byte[] buffer)
{
handler.post(new Runnable()
{
@Override
public void run()
{
try
{
track.write(buffer, 0, buffer.length);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}

//
static
{
// Load native library
System.loadLibrary("decoder");
}

// Private native methods
private static native boolean initEngine(String mediaSource);
private static native void releaseEngine();
private static native void renderAudio();

即使我创建一个缓冲区来代替 try-catch block :

byte [] buffer = new byte[256];
track.write(buffer, 0, buffer.length);

我得到了相同的结果 - NullPointerException。

堆栈跟踪:

java.lang.NullPointerException 在 com.mautilus.audioplayer.Player$2.run(Player.java:99) 在 android.os.Handler.handleCallback(Handler.java:587) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:123) 在 android.app.ActivityThread.main(ActivityThread.java:4627) 在 java.lang.reflect.Method.invokeNative( native 方法) 在 java.lang.reflect.Method.invoke(Method.java:521) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) 在dalvik.system.NativeStart.main( native 方法)

最佳答案

编辑:

要添加更多保护,我会添加:

if (!isInitialized) {
return;
}

writeToAudioTrack的前面方法以确保在 isInitialized 时不会调用回调是 false 。回调是如何注册的?你能显示该代码吗?

<小时/>

也许是一个愚蠢的答案,但在你的构造函数中,你确定它不应该是:

if (!isInitialized) {
...
}

如果不是,那么您确定 run()如果 isInitialized 则不会调用方法返回为 false从调用initEngine ?如果是这样的话 track将为 null,这将解释 run() 中的 NPE方法。

解决这个问题的一个简单方法是输入 assertrun() :

assertNotNull(trace);

或者进行适当的测试并抛出 IllegalStateException如果tracenull .

唯一可能导致 NPE 的情况是 null值为 buffer被传入writeToAudioTrack方法。测试 null在那里扔一个IllegalArgumentException可能是个好主意。

希望这有帮助。

关于java - 从 native 代码的回调中写入 AudioTrack 实例时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com