似乎出现了内存问题。我向回调发送了错误的对象。请参阅fadden的评论。我已经删除了对AttachCurrentThread的调用,因为在这种情况下它没有任何区别。
使mAudioTrack和mArr静态可解决该问题。
Java:
package com.example.jniaudiotrack;import android.app.Activity;import android.media.AudioFormat;import android.media.AudioManager;import android.media.AudioTrack;import android.os.Bundle;import android.os.Handler;import android.util.Log;public class JniAudioTrackActivity extends Activity { public AudioTrack mAudioTrack; public byte[] mArr; public static Handler mHandler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mArr = new byte[2048]; for (int i = 0; i < 2048; i++) { mArr[i] = (byte) (Math.sin(i) * 128); } mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT, 2048, AudioTrack.MODE_STREAM); mAudioTrack.play(); new Thread(new Runnable() { public void run() { audioFunc(); } }).start(); } public native void audioFunc(); @SuppressWarnings("unused") private void audioCB() { mHandler.post(new Runnable() { public void run() { mAudioTrack.write(mArr, 0, 2048); Log.i(TAG, "*** audioCB called ***"); } }); } private static final String TAG = "JniAudioTrackActivity"; static { System.loadLibrary("jni_audiotrack"); }}Cpp:
#include <jni.h>extern "C" { JNIEXPORT void Java_com_example_jniaudiotrack_JniAudioTrackActivity_audioFunc(JNIEnv* env, jobject obj);}JNIEXPORT void Java_com_example_jniaudiotrack_JniAudioTrackActivity_audioFunc(JNIEnv* env, jobject obj){ jclass cls = env->GetObjectClass(obj); jmethodID audioCBID = env->GetMethodID(cls, "audioCB", "()V"); if (!audioCBID) { return; } env->CallVoidMethod(obj, audioCBID);}


