如何使用本机代码中的 JNI 在 Android 上获取音频音量?
How to get audio volume on Android using JNI from native code?
我正在尝试使用 C++ 中的 JNI 在 Android 上获取音频音量。我的限制是我无权访问 Java 部分。
我找到了一种从该站点进行 JNI 查询的方法:AudioManager.cpp
但我想我在这段代码中的最后一次调用有问题:
jclass AudioManager = env->FindClass("android/media/AudioManager");
jmethodID getStreamVolume = env->GetMethodID(AudioManager, "getStreamVolume", "()I");
jint stream = 3; //STREAM_MUSIC
int volume = env->CallIntMethod(AudioManager, getStreamVolume, stream); //Crash here
在此代码中,我试图从 Android 文档中由 id=3 标识的 STREAM_MUSIC 获取音频音量:http://developer.android.com/reference/android/media/AudioManager.html#getStreamVolume(int)
编辑:这是我的工作代码:
jclass context = env->FindClass("android/content/Context");
jfieldID audioServiceField = env->GetStaticFieldID(context, "AUDIO_SERVICE", "Ljava/lang/String;");
jstring jstr = (jstring)env->GetStaticObjectField(context, audioServiceField);
jmethodID getSystemServiceID = env->GetMethodID(context, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
jobject tm = env->CallObjectMethod(currentAndroidActivity, getSystemServiceID, jstr);
jclass AudioManager = env->FindClass("android/media/AudioManager");
jmethodID getStreamVolume = env->GetMethodID(AudioManager, "getStreamVolume", "(I)I");
jint stream = 3; //MUSIC_STREAM = 3
int volume = env->CallIntMethod(tm, getStreamVolume, stream);
DEBUG_LOG(DEBUG_TAG, "volume = " + to_string(volume));
您需要一个 AudioManager 实例来调用该方法。要获取实例,您可以使用 context.getSystemService(Context.AUDIO_SERVICE)
(根据您链接到的文档)。
您链接到的 AudioManager.cpp
实际上并没有读取流量值,只是读取静态 STREAM_MUSIC
字段的值,因此不需要 AudioManager
的实例.
在此处获取 AudioManager
实例的主要问题实际上是您需要一个 Context
实例,通常是您的 Activity
、Service
或 Application
.
我正在尝试使用 C++ 中的 JNI 在 Android 上获取音频音量。我的限制是我无权访问 Java 部分。
我找到了一种从该站点进行 JNI 查询的方法:AudioManager.cpp
但我想我在这段代码中的最后一次调用有问题:
jclass AudioManager = env->FindClass("android/media/AudioManager");
jmethodID getStreamVolume = env->GetMethodID(AudioManager, "getStreamVolume", "()I");
jint stream = 3; //STREAM_MUSIC
int volume = env->CallIntMethod(AudioManager, getStreamVolume, stream); //Crash here
在此代码中,我试图从 Android 文档中由 id=3 标识的 STREAM_MUSIC 获取音频音量:http://developer.android.com/reference/android/media/AudioManager.html#getStreamVolume(int)
编辑:这是我的工作代码:
jclass context = env->FindClass("android/content/Context");
jfieldID audioServiceField = env->GetStaticFieldID(context, "AUDIO_SERVICE", "Ljava/lang/String;");
jstring jstr = (jstring)env->GetStaticObjectField(context, audioServiceField);
jmethodID getSystemServiceID = env->GetMethodID(context, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
jobject tm = env->CallObjectMethod(currentAndroidActivity, getSystemServiceID, jstr);
jclass AudioManager = env->FindClass("android/media/AudioManager");
jmethodID getStreamVolume = env->GetMethodID(AudioManager, "getStreamVolume", "(I)I");
jint stream = 3; //MUSIC_STREAM = 3
int volume = env->CallIntMethod(tm, getStreamVolume, stream);
DEBUG_LOG(DEBUG_TAG, "volume = " + to_string(volume));
您需要一个 AudioManager 实例来调用该方法。要获取实例,您可以使用 context.getSystemService(Context.AUDIO_SERVICE)
(根据您链接到的文档)。
您链接到的 AudioManager.cpp
实际上并没有读取流量值,只是读取静态 STREAM_MUSIC
字段的值,因此不需要 AudioManager
的实例.
在此处获取 AudioManager
实例的主要问题实际上是您需要一个 Context
实例,通常是您的 Activity
、Service
或 Application
.