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

jni-android-sys

从Rust访问Android JVM API的自动生成的粘合代码

5个版本

0.0.10 2020年1月14日
0.0.9 2019年8月28日

#260 in 操作系统

MIT/Apache

218MB
1.5M SLoC

jni-android-sys

正在开发中,仅部分可用,API尚未稳定

使用 jni-bindgen 将Android的Java API导出到Rust。迄今为止仅在Android API级别28进行了测试。

示例:Android Studio 示例 example_android_studio

..\example_android_studio\ 内容
app\src\main\java\MainActivity.java Java 源文件
rust\src\lib.rs Rust 源文件
app\build.gradle 应用程序构建配置
build.gradle 根构建配置

示例:内联

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
}

许可

根据您的选择,许可如下:

贡献

除非您明确说明,否则您提交的任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何其他条款或条件。

构建特性

特性 描述
"api-level-7" 将android API定义为API级别7或更高版本中的定义
... ...
"api-level-28" 将android API定义为API级别28或更高版本中的定义
"android-view-KeyEvent" 定义android.view.KeyEvent
"android-view-KeyEvent_Callback" 定义android.view.KeyEvent.Callback 接口
...数千个其他特性... 定义其他android.*, androidx.*, dalvik.*, java.*, javax.*, 和 org.* API。
"all" 定义所有可用的android/java API
"force-define" 在非Android目标上定义android API(用于自定义目标、文档等)
"force-define-x86_64-unknown-linux-gnu" x86_64-unknown-linux-gnu 上特别定义android API(用于docs.rs)
"nightly" 定义可能在夜间编译器上才能工作的一些内容(目前仅用于文档。)

依赖