Skip to content

Commit 201175c

Browse files
committed
Upgrade jni to 0.21
1 parent c86df55 commit 201175c

File tree

4 files changed

+50
-35
lines changed

4 files changed

+50
-35
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ license = "MIT"
77
description = "Android intent utilities"
88

99
[dependencies]
10-
jni = "0.20.0"
10+
jni = "0.21"
1111
ndk-context = "0.1.1"
1212

1313
[workspace]

example/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ crate-type = ["cdylib"]
99
[dependencies]
1010
android-activity = { version = "0.4.0", features = ["native-activity"] }
1111
android-intent.path = "../"
12-
jni = "0.20.0"
12+
jni = "0.21"
1313
ndk-context = "0.1.1"
1414

1515
[package.metadata.android.sdk]

src/intent.rs

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,43 @@
1-
use jni::{errors::Error, objects::JObject, JNIEnv};
2-
3-
struct Inner<'env> {
4-
env: JNIEnv<'env>,
1+
use jni::{
2+
errors::Error,
3+
objects::{JObject, JString, JValue},
4+
JNIEnv,
5+
};
6+
7+
struct Inner<'vm, 'env> {
8+
env: &'vm mut JNIEnv<'env>,
59
object: JObject<'env>,
610
}
711

812
/// A messaging object you can use to request an action from another android app component.
913
#[must_use]
10-
pub struct Intent<'env> {
11-
inner: Result<Inner<'env>, Error>,
14+
pub struct Intent<'vm, 'env> {
15+
inner: Result<Inner<'vm, 'env>, Error>,
1216
}
1317

14-
impl<'env> Intent<'env> {
15-
pub fn from_object(env: JNIEnv<'env>, object: JObject<'env>) -> Self {
18+
impl<'vm, 'env> Intent<'vm, 'env> {
19+
pub fn from_object(env: &'vm mut JNIEnv<'env>, object: JObject<'env>) -> Self {
1620
Self {
1721
inner: Ok(Inner { env, object }),
1822
}
1923
}
2024

21-
fn from_fn(f: impl FnOnce() -> Result<Inner<'env>, Error>) -> Self {
25+
fn from_fn(f: impl FnOnce() -> Result<Inner<'vm, 'env>, Error>) -> Self {
2226
let inner = f();
2327
Self { inner }
2428
}
2529

26-
pub fn new(env: JNIEnv<'env>, action: impl AsRef<str>) -> Self {
30+
pub fn new(env: &'vm mut JNIEnv<'env>, action: impl AsRef<str>) -> Self {
2731
Self::from_fn(|| {
2832
let intent_class = env.find_class("android/content/Intent")?;
2933
let action_view =
30-
env.get_static_field(intent_class, action.as_ref(), "Ljava/lang/String;")?;
34+
env.get_static_field(&intent_class, action.as_ref(), "Ljava/lang/String;")?;
3135

32-
let intent = env.new_object(intent_class, "(Ljava/lang/String;)V", &[action_view])?;
36+
let intent = env.new_object(
37+
&intent_class,
38+
"(Ljava/lang/String;)V",
39+
&[action_view.borrow()],
40+
)?;
3341

3442
Ok(Inner {
3543
env,
@@ -38,25 +46,30 @@ impl<'env> Intent<'env> {
3846
})
3947
}
4048

41-
pub fn new_with_uri(env: JNIEnv<'env>, action: impl AsRef<str>, uri: impl AsRef<str>) -> Self {
49+
pub fn new_with_uri(
50+
env: &'env mut JNIEnv<'env>,
51+
action: impl AsRef<str>,
52+
uri: impl AsRef<str>,
53+
) -> Self {
4254
Self::from_fn(|| {
4355
let url_string = env.new_string(uri)?;
4456
let uri_class = env.find_class("android/net/Uri")?;
4557
let uri = env.call_static_method(
4658
uri_class,
4759
"parse",
4860
"(Ljava/lang/String;)Landroid/net/Uri;",
49-
&[url_string.into()],
61+
&[JValue::Object(&url_string)],
5062
)?;
5163

5264
let intent_class = env.find_class("android/content/Intent")?;
53-
let action_view =
54-
env.get_static_field(intent_class, action.as_ref(), "Ljava/lang/String;")?;
65+
let action_view = env
66+
.get_static_field(&intent_class, action.as_ref(), "Ljava/lang/String;")?
67+
.l()?;
5568

5669
let intent = env.new_object(
57-
intent_class,
70+
&intent_class,
5871
"(Ljava/lang/String;Landroid/net/Uri;)V",
59-
&[action_view, uri],
72+
&[JValue::Object(&action_view), uri.borrow()],
6073
)?;
6174

6275
Ok(Inner {
@@ -85,10 +98,10 @@ impl<'env> Intent<'env> {
8598
let class_name = inner.env.new_string(class_name)?;
8699

87100
inner.env.call_method(
88-
inner.object,
101+
&inner.object,
89102
"setClassName",
90103
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
91-
&[package_name.into(), class_name.into()],
104+
&[JValue::Object(&package_name), JValue::Object(&class_name)],
92105
)?;
93106

94107
Ok(inner)
@@ -110,10 +123,10 @@ impl<'env> Intent<'env> {
110123
let value = inner.env.new_string(value)?;
111124

112125
inner.env.call_method(
113-
inner.object,
126+
&inner.object,
114127
"putExtra",
115128
"(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
116-
&[key.into(), value.into()],
129+
&[JValue::Object(&key), JValue::Object(&value)],
117130
)?;
118131

119132
Ok(inner)
@@ -136,18 +149,17 @@ impl<'env> Intent<'env> {
136149
pub fn into_chooser_with_title(self, title: Option<impl AsRef<str>>) -> Self {
137150
self.and_then(|mut inner| {
138151
let title_value = if let Some(title) = title {
139-
let s = inner.env.new_string(title)?;
140-
s.into()
152+
inner.env.new_string(title)?
141153
} else {
142-
JObject::null().into()
154+
JString::default()
143155
};
144156

145157
let intent_class = inner.env.find_class("android/content/Intent")?;
146158
let intent = inner.env.call_static_method(
147159
intent_class,
148160
"createChooser",
149161
"(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;",
150-
&[inner.object.into(), title_value],
162+
&[JValue::Object(&inner.object), JValue::Object(&title_value)],
151163
)?;
152164

153165
inner.object = intent.try_into()?;
@@ -169,10 +181,10 @@ impl<'env> Intent<'env> {
169181
let jstring = inner.env.new_string(type_name)?;
170182

171183
inner.env.call_method(
172-
inner.object,
184+
&inner.object,
173185
"setType",
174186
"(Ljava/lang/String;)Landroid/content/Intent;",
175-
&[jstring.into()],
187+
&[JValue::Object(&jstring)],
176188
)?;
177189

178190
Ok(inner)
@@ -188,14 +200,17 @@ impl<'env> Intent<'env> {
188200
activity,
189201
"startActivity",
190202
"(Landroid/content/Intent;)V",
191-
&[inner.object.into()],
203+
&[JValue::Object(&inner.object)],
192204
)?;
193205

194206
Ok(())
195207
})
196208
}
197209

198-
fn and_then(mut self, f: impl FnOnce(Inner) -> Result<Inner, Error>) -> Self {
210+
fn and_then(
211+
mut self,
212+
f: impl FnOnce(Inner<'vm, 'env>) -> Result<Inner<'vm, 'env>, Error>,
213+
) -> Self {
199214
self.inner = self.inner.and_then(f);
200215
self
201216
}

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ pub use intent::Intent;
99
use jni::{JNIEnv, JavaVM};
1010

1111
/// Run 'f' with the current [`JNIEnv`] from [`ndk_context`].
12-
pub fn with_current_env(f: impl FnOnce(JNIEnv)) {
12+
pub fn with_current_env(f: impl FnOnce(&mut JNIEnv)) {
1313
let cx = ndk_context::android_context();
1414
let vm = unsafe { JavaVM::from_raw(cx.vm().cast()) }.unwrap();
15-
let env = vm.attach_current_thread().unwrap();
15+
let mut env = vm.attach_current_thread().unwrap();
1616

17-
f(*env);
17+
f(&mut env);
1818
}

0 commit comments

Comments
 (0)