Audio系统的JNI代码
来源:互联网 发布:五大臣出洋考察 知乎 编辑:程序博客网 时间:2024/05/22 13:27
Android JNI代码
http://www.eoeandroid.com/forum-viewthread-tid-75140-fromuid-497034.html
Audio系统的JNI代码
Android的Audio部分通过JNI向Java层提供接口,在Java层可以通过JNI接口完成Audio系统的大部分操作。
Audio JNI部分的代码路径为:frameworks/base/core/jni。
其中,主要实现的3个文件为:android_media_AudioSystem.cpp、android_media_Audio Track.cpp和
android_media_AudioRecord.cpp,它们分别对应了Android Java框架中的3个类的支持:
android.media.AudioSystem:负责Audio系统的总体控制;
android.media.AudioTrack:负责Audio系统的输出环节;
android.media.AudioRecorder:负责Audio系统的输入环节。
在Android的Java层中,可以对Audio系统进行控制和数据流操作,对于控制操作,和底层的处理基本一致;但是对于数据流操作,由于Java不支持指针,因此接口被封装成了另外的形式。
例如,对于音频输出,android_media_AudioTrack.cpp提供的是写字节和写短整型的接口类型。
Java代码:
- static jint android_media_AudioTrack_native_write(JNIEnv *env, jobject thiz, jbyteArray javaAudioData, jint offsetInBytes, jint sizeInBytes, jint javaAudioFormat) {
- jbyte* cAudioData = NULL;
- AudioTrack *lpTrack = NULL;
- lpTrack = (AudioTrack *)env->GetIntField( thiz, javaAudioTrackFields. Native TrackInJavaObj);
- // …… 省略部分内容
- ssize_t written = 0;
- if (lpTrack->sharedBuffer() == 0) {
- //进行写操作
- written = lpTrack->write(cAudioData +offsetInBytes, sizeInBytes);
- } else {
- if (javaAudioFormat == javaAudioTrackFields.PCM16) {
- memcpy(lpTrack->sharedBuffer()->pointer(), cAudioData+offsetInBytes, sizeInBytes);
- written = sizeInBytes;
- }
- else if (javaAudioFormat == javaAudioTrackFields.PCM8) {
- int count = sizeInBytes;
- int16_t *dst = (int16_t *)lpTrack->sharedBuffer()->pointer();
- const int8_t *src = (const int8_t *)(cAudioData + offsetInBytes);
- while(count--) {
- *dst++ = (int16_t)(*src++^0x80) << 8;
- }
- written = sizeInBytes;
- }
- }
- // …… 省略部分内容
- env->ReleasePrimitiveArrayCritical(javaAudioData, cAudioData, 0);
- return (int)written;
- }
所定义的JNI接口native_write_byte和native_write_short如下所示:
Java代码:
- {"native_write_byte", "([BIII]I", (void *)android_media_AudioTrack_native_write), {"native_write_short", "([SIII]I", (void *)android_media_AudioTrack_native_ write_short),
向Java提供native_write_byte和native_write_short接口,它们一般是通过调用AudioTrack的write()函数来完成的,只是在Java的数据类型和C++的指针中做了一步转换。
- Audio系统的JNI代码
- Android Audio代码分析25 - JNI callback
- Android的Audio系统
- Android的Audio系统
- Android的Audio系统
- Android的Audio 系统
- android的audio系统
- Android的Audio系统
- Android的Audio系统
- Android的Audio系统
- Android的Audio系统
- Android的Audio系统
- Android的Audio系统
- android audio系统的概况
- Android的Audio系统详解
- Audio系统
- 【转】Android的Audio系统(一)
- 【转】Android的Audio系统(二)
- 在 .NET Framework 3.5 中管理目录安全主体
- 忘记我做不到
- 30个最酷的Windows Phone 7教程
- WINCE 文本读写操作总结
- js arguments对象
- Audio系统的JNI代码
- 改良程序需要的11个技巧
- jQuery Mobile简单使用说明
- 记录一些学习android的网址
- STL介绍
- 文件后缀大全
- java线程典例
- 2011年应关注的5项Web技术 jQuery移动版入选
- Techcrunch:将会成为2011年主流的七大IT技术