Android JNI
来源:互联网 发布:visio软件结构图 编辑:程序博客网 时间:2024/06/06 11:48
public native void pause() throws IllegalStateException;
public native void resume() throws IllegalStateException;
(2)frameworks\base\media\jni\android_media_MediaRecorder.cpp中添加如下方法:
static void
android_media_MediaRecorder_pause(JNIEnv *env, jobject thiz)
{
LOGE("android_media_MediaRecorder_pause");
sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
process_media_recorder_call(env, mr->pause(), "java/lang/RuntimeException", "pause failed.");
}
static void
android_media_MediaRecorder_resume(JNIEnv *env, jobject thiz)
{
LOGV("resume");
sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
process_media_recorder_call(env, mr->resume(), "java/lang/RuntimeException", "resume failed.");
}
同时在该文件的 JNINativeMethod gMethods[]数组中添加
{"pause", "()V", (void *)android_media_MediaRecorder_pause},
{"resume", "()V", (void *)android_media_MediaRecorder_resume},
(3)\frameworks\base\include\media\IMediaRecorder.h 和 \frameworks\base\include\media\MediaRecorderBase.h 中添加
virtual status_t pause() = 0;
virtual status_t resume() = 0;
(4)\frameworks\base\include\media\mediarecorder.h中添加如下变量和如下方法:
MEDIA_RECORDER_PAUSED = 1 << 5,
status_t pause();
status_t resume();
(5)frameworks\base\media\libmedia\mediarecorder.cpp在该文件中添加如下:
a)
status_t MediaRecorder::start(){
......
}
b)status_t MediaRecorder::stop(){
......
}
c)添加如下两个方法:
status_t MediaRecorder::pause()
{
...........
return ret;
}
status_t MediaRecorder::resume()
{
...........
return ret;
}
d)在status_t MediaRecorder::reset(){
............
}
(6)\frameworks\base\media\libmedia\IMediaRecorder.cpp中添加两个状态变量和两个调用的方法:
a)两个变量:
PAUSE,
RESUME
b)两个方法:
status_t pause()
{
LOGV("pause");
Parcel data, reply;
data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
remote()->transact(PAUSE, data, &reply);
return reply.readInt32();
}
//end
status_t resume()
{
LOGV("resume");
Parcel data, reply;
data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
remote()->transact(RESUME, data, &reply);
return reply.readInt32();
}
c)同时在该文件的BnMediaRecorder::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)方法中添加如下语句:
....
case PAUSE: {
LOGV("PAUSE");
CHECK_INTERFACE(IMediaRecorder, data, reply);
reply->writeInt32(pause());
return NO_ERROR;
}break;
// end
case RESUME: {
LOGV("RESUME");
CHECK_INTERFACE(IMediaRecorder, data, reply);
reply->writeInt32(resume());
return NO_ERROR;
} break;
......
(7)frameworks\base\media\libmediaplayerservice\MediaRecorderClient.h中添加
virtual status_t pause();
virtual status_t resume();
(8)frameworks\base\media\libmediaplayerservice\MediaRecorderClient.cpp中添加:
status_t MediaRecorderClient::pause()
{
LOGV("pause");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
LOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->pause();
}
//end
status_t MediaRecorderClient::resume()
{
LOGV("resume");
Mutex::Autolock lock(mLock);
if (mRecorder == NULL) {
LOGE("recorder is not initialized");
return NO_INIT;
}
return mRecorder->resume();
}
(9)frameworks\base\media\libmediaplayerservice\StagefrightRecorder.h中添加如下代码:
virtual status_t resume();
virtual status_t pause(); //此方法在StagefrightRecorder.h中本来就存在
(10)frameworks\base\media\libmediaplayerservice\StagefrightRecorder.cpp中添加如下代码:
// we don't really need this, USE start() INSTEAD.
status_t StagefrightRecorder::resume() {
LOGV("resume");
if (mWriter == NULL) {
return UNKNOWN_ERROR;
}
mWriter->start();
return OK;
}
// -- END
status_t StagefrightRecorder::pause() { } 方法在此类中固有,故而省略
(10)frameworks\base\media\libstagefright\AudioSource.cpp中有AudioRecord类和read()方法
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
JNI调用方法:(1)在android_media_AudioSystem.cpp中添加如下信息:
(1)在AudioSystem.java中添加
/**
* @hide
*/
public static native int setMasterVolume(int vol);
(2)在android_media_AudioSystem.cpp中添加如下信息:
a) // ++ xxxx
static int
android_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jint vol)
{
return check_AudioSystem_Command(AudioSystem::setMasterVolume((float)vol / 100));
}
// -- END
b) static JNINativeMethod gMethods[] = {
{"setParameters", "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters},
{"getParameters", "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_AudioSystem_getParameters},
......
{"setMasterVolume", "(I)I", (void*)android_media_AudioSystem_setMasterVolume},
};
(3) 在AudioSystem.h和AudioSystem.cpp中声明和实现
static status_t setMasterVolume(float value);
- [JNI] Android JNI总结
- Android JNI
- Android JNI
- android JNI
- Android JNI
- android jni
- android JNI
- Android JNI
- android jni
- android JNI
- android JNI
- android JNI
- android jni
- Android JNI
- Android JNI
- Android JNI
- android JNI
- android jni
- linux下面快速删除大量文件及快速复制大量小文件
- javascript 操作excel
- 增加自己的耐性
- Linux 下设置时间间隔的Signal函数
- js散记
- Android JNI
- org.hibernate.NonUniqueObjectException: a different object with the same identifier value was alread
- 2012年最新的12款超棒jQuery插件
- LINUX中断机制与信号
- nginx配置详解
- Linux中断解析
- java语言学习历程小结(四)
- 使用JavaScript中的ActiveXObject填充并设置Excel格式
- 向量概念,零向量,向量取反,计算向量的长度,单位向量