Android JNI

来源:互联网 发布:visio软件结构图 编辑:程序博客网 时间:2024/06/06 11:48
(1)\frameworks\base\media\java\android\media\MediaRecorder.java中添加如下两个方法:
    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);

原创粉丝点击