Skip to content

Commit

Permalink
Replace ndk-glue with ndk-context
Browse files Browse the repository at this point in the history
  • Loading branch information
zmerp committed Feb 16, 2022
1 parent 2603ff6 commit fb7e3eb
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 40 deletions.
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ path = "sys"
version = "0.6"
optional = true

[dependencies.ndk-glue]
version = "0.6"
[dependencies.ndk-context]
version = "0.1"
optional = true

[dependencies.jni]
Expand All @@ -39,7 +39,7 @@ shared-link = ["oboe-sys/shared-link"]
shared-stdcxx = ["oboe-sys/shared-stdcxx"]
generate-bindings = ["oboe-sys/generate-bindings"]
fetch-prebuilt = ["oboe-sys/fetch-prebuilt"]
java-interface = ["ndk", "ndk-glue", "jni"]
java-interface = ["ndk", "ndk-context", "jni"]
doc-cfg = []

[package.metadata.docs.rs]
Expand Down
6 changes: 3 additions & 3 deletions src/java_interface/audio_features.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::{
utils::{
get_activity, get_package_manager, has_system_feature, with_attached, JNIEnv, JObject,
get_context, get_package_manager, has_system_feature, with_attached, JNIEnv, JObject,
JResult,
},
PackageManager,
Expand Down Expand Up @@ -37,9 +37,9 @@ impl AudioFeature {
* Check availability of an audio feature using Android Java API
*/
pub fn has(&self) -> Result<bool, String> {
let activity = get_activity();
let context = get_context();

with_attached(activity, |env, activity| {
with_attached(context, |env, activity| {
try_check_system_feature(env, activity, (*self).into())
})
.map_err(|error| error.to_string())
Expand Down
26 changes: 16 additions & 10 deletions src/java_interface/devices_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use super::{
utils::{
call_method_no_args_ret_bool, call_method_no_args_ret_char_sequence,
call_method_no_args_ret_int, call_method_no_args_ret_int_array,
call_method_no_args_ret_string, get_activity, get_devices, get_system_service,
call_method_no_args_ret_string, get_context, get_devices, get_system_service,
with_attached, JNIEnv, JObject, JResult,
},
AudioDeviceDirection, AudioDeviceInfo, Context,
Expand All @@ -18,17 +18,23 @@ impl AudioDeviceInfo {
*/
#[cfg_attr(feature = "doc-cfg", doc(cfg(feature = "java-interface")))]
pub fn request(direction: AudioDeviceDirection) -> Result<Vec<AudioDeviceInfo>, String> {
let activity = get_activity();
let sdk_version = activity.sdk_version();
let context = get_context();

if sdk_version >= 23 {
with_attached(activity, |env, activity| {
with_attached(context, |env, activity| {
let sdk_version = env
.get_static_field("android/os/Build$VERSION", "SDK_INT", "I")?
.i()?;

if sdk_version >= 23 {
try_request_devices_info(env, activity, direction)
})
.map_err(|error| error.to_string())
} else {
Err("Method unsupported".into())
}
} else {
Err(jni::errors::Error::MethodNotFound {
name: "".into(),
sig: "".into(),
})
}
})
.map_err(|error| error.to_string())
}
}

Expand Down
49 changes: 30 additions & 19 deletions src/java_interface/stream_defaults.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::{
utils::{
get_activity, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult,
get_context, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult,
},
AudioManager, Context,
};
Expand All @@ -13,27 +13,38 @@ impl DefaultStreamValues {
*/
#[cfg_attr(feature = "doc-cfg", doc(cfg(feature = "java-interface")))]
pub fn init() -> Result<(), String> {
let activity = get_activity();
let sdk_version = activity.sdk_version();
let activity = get_context();

if sdk_version < 17 {
Err("Unimplemented".into())
} else if sdk_version < 26 {
match with_attached(activity, try_request_default_stream_values) {
Ok((sample_rate, frames_per_burst)) => {
if let Some(value) = sample_rate {
Self::set_sample_rate(value);
}
if let Some(value) = frames_per_burst {
Self::set_frames_per_burst(value);
}
Ok(())
let values = with_attached(activity, |env, activity| {
let sdk_version = env
.get_static_field("android/os/Build$VERSION", "SDK_INT", "I")?
.i()?;

if sdk_version < 17 {
Err(jni::errors::Error::MethodNotFound {
name: "".into(),
sig: "".into(),
})
} else if sdk_version < 26 {
try_request_default_stream_values(env, activity).map(|vals| Some(vals))
} else {
// not necessary
Ok(None)
}
});

match values {
Ok(Some((sample_rate, frames_per_burst))) => {
if let Some(value) = sample_rate {
Self::set_sample_rate(value);
}
if let Some(value) = frames_per_burst {
Self::set_frames_per_burst(value);
}
Err(error) => Err(error.to_string()),
Ok(())
}
} else {
// not necessary
Ok(())
Ok(None) => Ok(()),
Err(error) => Err(error.to_string()),
}
}
}
Expand Down
12 changes: 7 additions & 5 deletions src/java_interface/utils.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use jni::sys::jobject;
use ndk_context::AndroidContext;
use std::sync::Arc;

pub use jni::Executor;
Expand All @@ -11,16 +13,16 @@ pub use jni::{
JNIEnv, JavaVM,
};

pub fn get_activity() -> &'static NativeActivity {
ndk_glue::native_activity()
pub fn get_context() -> AndroidContext {
ndk_context::android_context()
}

pub fn with_attached<F, R>(activity: &NativeActivity, closure: F) -> JResult<R>
pub fn with_attached<F, R>(context: AndroidContext, closure: F) -> JResult<R>
where
F: FnOnce(&JNIEnv, JObject) -> JResult<R>,
{
let vm = Arc::new(unsafe { JavaVM::from_raw(activity.vm())? });
let activity = activity.activity();
let vm = Arc::new(unsafe { JavaVM::from_raw(context.vm().cast())? });
let activity = context.context() as jobject;
Executor::new(vm).with_attached(|env| closure(env, activity.into()))
}

Expand Down

0 comments on commit fb7e3eb

Please sign in to comment.