AudioSystem과 AudioSystem.java를 이용한 JNI 단에서의 연결
김재훈 (이솝 임베디드 포럼)
1. AudioSystem과 AudioSystem.java를 연결하는 JNI 단에 대해 기술되어 있는 코드는 다음에 위치해 있다.
frameworks/base/core/jni/android_media_AudioSystem.cpp // 193라인
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},
{"muteMicrophone", "(Z)I", (void *)android_media_AudioSystem_muteMicrophone},
{"isMicrophoneMuted", "()Z", (void *)android_media_AudioSystem_isMicrophoneMuted},
{"isMusicActive", "()Z", (void *)android_media_AudioSystem_isMusicActive},
{"setDeviceConnectionState", "(IILjava/lang/String;)I", (void *)android_media_AudioSystem_setDeviceConnectionState},
{"getDeviceConnectionState", "(ILjava/lang/String;)I", (void *)android_media_AudioSystem_getDeviceConnectionState},
{"setPhoneState", "(I)I", (void *)android_media_AudioSystem_setPhoneState},
{"setRingerMode", "(II)I", (void *)android_media_AudioSystem_setRingerMode},
{"setForceUse", "(II)I", (void *)android_media_AudioSystem_setForceUse},
{"getForceUse", "(I)I", (void *)android_media_AudioSystem_getForceUse},
{"initStreamVolume", "(III)I", (void *)android_media_AudioSystem_initStreamVolume},
{"setStreamVolumeIndex","(II)I", (void *)android_media_AudioSystem_setStreamVolumeIndex},
{"getStreamVolumeIndex","(I)I", (void *)android_media_AudioSystem_getStreamVolumeIndex}
};
2. 위는 JNINativeMethod gMethods[]의 데이터는 C언어단과 JAVA 단을 매핑 시켜주기 위한 테이블이며,
다음의 형식을 띄고 있다.
{"setParameters", "(Ljava/lang/String;)I", (void *)android_media_AudioSystem_setParameters},
[ C언어 함수 ] ([자료형])리턴형 JAVA의 함수, "_"는 JAVA에서 "."으로 변환되어 사용되며,
android_media_AudioSystem_setParameters는 android.media.AudioSystem.setParameters로 JAVA에서 사용된다.
3. 앞의 JNINativeMethod gMethods[] 다음과 같이 registerNativeMethods(); 함수를 통하여, JNI로 등록하게 된다.
const char* const kClassPathName = "android/media/AudioSystem";
int register_android_media_AudioSystem(JNIEnv *env)
{
AudioSystem::setErrorCallback(android_media_AudioSystem_error_callback);
return AndroidRuntime::registerNativeMethods(env,
"android/media/AudioSystem", gMethods, NELEM(gMethods));
}