#android #jni #jvm #api-access #bindgen

jni-android-sys

Autogenerated glue code for access Android JVM APIs from Rust

5 releases

0.0.10 Jan 14, 2020
0.0.9 Aug 28, 2019

#260 in Operating systems

MIT/Apache

218MB
1.5M SLoC

jni-android-sys

Work in progress, only barely kinda partially usable, APIs not yet stabilized

Uses jni-bindgen to export Android's Java APIs to Rust. Only tested against Android API level 28 so far.

Example: example_android_studio Android Studio Example

..\example_android_studio\ What
app\src\main\java\MainActivity.java Java Source
rust\src\lib.rs Rust Source
app\build.gradle App Build Config
build.gradle Root Build Config

Example: Inline

Cargo.toml

[dependencies]
jni-android-sys = { version = "0.0.10", features = ["api-level-28", "android-view-KeyEvent"] }

MainActivity.java

package com.example;

import androidx.appcompat.app.AppCompatActivity;
import android.view.KeyEvent;

public class MainActivity extends AppCompatActivity {
    static { System.loadLibrary("example"); }
    @Override public native boolean dispatchKeyEvent(KeyEvent keyEvent);
}

main_activity.rs

use jni_sys::{jboolean, jobject, JNI_TRUE};
use jni_glue::{Argument, Env};
use jni_android_sys::android::view::KeyEvent;

#[no_mangle] pub extern "system" fn Java_com_example_MainActivity_dispatchKeyEvent(
    env:        &Env,
    _this:      jobject,
    key_event:  Argument<KeyEvent>,
) -> jboolean {
    let key_event = unsafe { key_event.with_unchecked(env) }; // Unsafe boilerplate not yet autogenerated.

    // Err = Java exception was thrown.
    // Ok(None) = Java object is null.
    // Ok(Some(...)) = Real java object!
    if let Some(key_event) = key_event {
        let is_enter = if let Ok(r) = key_event.getKeyCode() { r == KeyEvent::KEYCODE_ENTER } else { false };
        let is_down  = if let Ok(r) = key_event.getAction()  { r == KeyEvent::ACTION_DOWN   } else { false };
        if is_enter && is_down {
            println!("ENTER pressed"); // Not that you can see this...
        }
    }

    JNI_TRUE // JNI boilerplate not yet autogenerated
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Build Features

feature description
"api-level-7" Define android APIs as they were defined in API level 7 or greater
... ...
"api-level-28" Define android APIs as they were defined in API level 28 or greater
"android-view-KeyEvent" Define the android.view.KeyEvent class
"android-view-KeyEvent_Callback" Define the android.view.KeyEvent.Callback interface
...thousands of other features... Define other android.*, androidx.*, dalvik.*, java.*, javax.*, and org.* APIs.
"all" Define all the available android/java APIs
"force-define" Define android APIs on non-android targets (for use in custom targets, docs, etc.)
"force-define-x86_64-unknown-linux-gnu" Define android APIs on x86_64-unknown-linux-gnu specifically (for use in docs.rs)
"nightly" Define some stuff which may only work on nightly compilers (right now just for docs.)

Dependencies