Я выполняю некоторый процесс декодирования в собственном коде и вызываю из него Java-метод для записи сэмплов в экземпляр AudioTrack.Процесс декодирования работает нормально, вызывается обратный вызов из собственного кода в 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:
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 (собственный метод) на 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 (собственный метод)