Skip to content

Commit 0ed7251

Browse files
committed
stash: examples/test-jni-sig-macros.rs (bind as methods)
1 parent 98f3136 commit 0ed7251

File tree

1 file changed

+49
-25
lines changed

1 file changed

+49
-25
lines changed

examples/test-jni-sig-macros.rs

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,11 @@ macro_rules! jgen_bind_method {
13471347
/// Emits a cacheable method IDs API struct, lookup APIs and call APIs for a given set of methods
13481348
///
13491349
/// # Usage
1350+
/// ```
1351+
/// fn example_native_impl<'local>(env: &mut Env<'local>, this: JTest<'local>, arg0: jint, arg1: impl AsRef<JString>) -> Result<jboolean> {
1352+
/// // ...
1353+
/// Ok(true)
1354+
/// }
13501355
///
13511356
/// jgen_bind_api!{
13521357
/// JTestAPI,
@@ -1356,60 +1361,79 @@ macro_rules! jgen_bind_method {
13561361
/// },
13571362
/// set_message = {
13581363
/// name = "setMessage",
1359-
/// sig = (java.lang.String as JString) -> void,
1364+
/// sig = (msg: java.lang.String as JString) -> void,
13601365
/// }
13611366
/// },
13621367
/// static_methods = {
13631368
/// example_static = {
13641369
/// name = "exampleStatic",
1365-
/// sig = (jint, java.lang.String as JString) -> jboolean,
1370+
/// sig = (val: jint, name: java.lang.String as JString) -> jboolean,
13661371
/// }
13671372
/// },
13681373
/// native_methods = {
13691374
/// example_native = {
13701375
/// name = "exampleNative",
1371-
/// sig = (jint, java.lang.String as JString) -> jboolean,
1376+
/// sig = (val: jint, name: java.lang.String as JString) -> jboolean,
13721377
/// fn = example_native_impl,
13731378
/// }
13741379
/// }
13751380
/// }
1381+
/// ```
13761382
///
13771383
/// # Outputs
13781384
///
1385+
/// ```
13791386
/// pub struct JTestAPI {
13801387
/// class: Global<JClass>,
1381-
/// get_message: JMethodID,
1382-
/// set_message: JMethodID,
1383-
/// example_static: JStaticMethodID,
1388+
/// get_message_method_id: JMethodID,
1389+
/// set_message_method_id: JMethodID,
1390+
/// example_static_method_id: JStaticMethodID,
13841391
/// }
13851392
/// impl JTestAPI {
1386-
/// pub fn get(env: &mut Env) -> Result<&'static Self> {
1387-
/// let static API: OnceCell<JTestAPI> = OnceCell::new();
1393+
/// pub fn get(env: &Env, loader_context: &LoaderContext) -> Result<&'static Self> {
1394+
/// static API: once_cell::sync::OnceCell<JTestAPI> = once_cell::sync::OnceCell::new();
13881395
/// API.get_or_try_init(|| {
1389-
/// let class = env.find_class("com/example/Test")?.into_global(env);
1390-
/// let native_methods: &[JNativeMethod] = &[
1391-
/// JNativeMethod {
1392-
/// name: "exampleNative",
1393-
/// sig: "(ILjava/lang/String;)Z",
1394-
/// fn: example_native_impl,
1395-
/// }
1396-
/// ];
1397-
/// env.register_native_methods(&class, native_methods)?;
1398-
/// Ok(JTestAPI {
1399-
/// class: env.new_global_ref(class.as_ref())?,
1400-
/// get_message: env.get_method_id(&class, "getMessage", "()Ljava/lang/String;")?,
1401-
/// set_message: env.get_method_id(&class, "setMessage", "(Ljava/lang/String;)V")?,
1402-
/// example_static: env.get_static_method_id(&class, "exampleStatic", "(ILjava/lang/String;)Z")?,
1396+
/// let mut env = env.with_local_frame(8, |env| {
1397+
/// let class = env.find_class("com/example/Test")?.into_global(env);
1398+
/// let native_methods: &[JNativeMethod] = &[
1399+
/// JNativeMethod {
1400+
/// name: "exampleNative",
1401+
/// sig: "(ILjava/lang/String;)Z",
1402+
/// fn: Self::example_native__shim,
1403+
/// }
1404+
/// ];
1405+
/// env.register_native_methods(&class, native_methods)?;
1406+
/// Ok(JTestAPI {
1407+
/// class: env.new_global_ref(class.as_ref())?,
1408+
/// get_message_method_id: env.get_method_id(&class, "getMessage", "()Ljava/lang/String;")?,
1409+
/// set_message_method_id: env.get_method_id(&class, "setMessage", "(Ljava/lang/String;)V")?,
1410+
/// example_static_method_id: env.get_static_method_id(&class, "exampleStatic", "(ILjava/lang/String;)Z")?,
1411+
/// })
14031412
/// })
14041413
/// })
1405-
/// }
1414+
/// }
1415+
/// fn example_native__shim<'local>(env: UnownedEnv, this: JTest<'local>, arg0: jint, arg1: jni::sys::jobject) -> jboolean {
1416+
/// }
14061417
/// }
14071418
///
14081419
/// impl JTest {
14091420
/// pub fn get_message(&self, env: &mut Env) -> Result<JString> {
1410-
/// let api = JTestAPI::get(env)?;
1411-
/// _get_message_call(env, self, api.get_message)
1421+
/// let api = JTestAPI::get(env, &LoaderContext::None)?;
1422+
/// let jni_args = [ ];
1423+
/// __jgen_emit_jni_sys_call!(env, api.get_message_method_id, jni_args)
1424+
/// }
1425+
/// pub fn set_message(&self, env: &Env, msg: impl AsRef<JString>) -> Result<()> {
1426+
/// let api = JTestAPI::get(env, &LoaderContext::None)?;
1427+
/// let jni_args = [msg.as_ref().as_raw()];
1428+
/// __jgen_emit_jni_sys_call!(env, api.set_message_method_id, jni_args)
1429+
/// }
1430+
/// pub fn example_static(env: &mut Env, val: jint, msg: impl AsRef<JString>) -> Result<jboolean> {
1431+
/// let api = JTestAPI::get(env, &LoaderContext::None)?;
1432+
/// let jni_args = [val, msg.as_ref().as_raw()];
1433+
/// __jgen_emit_jni_sys_call!(env, api.example_static_method_id, jni_args)
1434+
/// }
14121435
/// }
1436+
/// ```
14131437
macro_rules! jgen_bind_methods {
14141438
() => {
14151439
todo!()

0 commit comments

Comments
 (0)