按(一)中所述,内存拷贝等很浪费空间,而且传递时容易出错。换种思路:在JNI层播放,将AudioTrack拿到底层来。
尝试:先不管效率问题,解一帧播一帧,OK。效果:播放有些文件很卡,有些不是那么卡。
思考卡的原因:解码慢?都是用这个解码,暂时排除;
解一帧播一帧中的间隙?修改,在JNI层开两个线程,一个解码,一个播放。
实践:开播放线程时候遇到问题,JNIenv不能直接传递,子线程中不能直接使用,要新建JAVAVM再取,此处一直报错E:\myspace\videoActivity/jni/
native.c:515: undefined reference to `JNI_CreateJavaVM' ,查询JNI的英文手册,找不到解决办法 ,故放弃 。
换种思路:在JAVA层开线程,并进行线程的一系列控制维护操作等,但线程里的事还是有JNI层做,以此避开上个线程报错问题。
一、对JAVA多线程的学习java.lang.Thread
Java多线程程序中经常用到的方法有以下几个:run(),start(),wait(),sleep(),notify(),notifyAll(),yield()线程的让步,join(),还有一个重要的关键字 synchronized。
1、run()和start()
这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是
public访问权限,返回值类型为void。
1、 关键字Synchronized
这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,
阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。