5个版本
0.0.10 | 2020年1月14日 |
---|---|
0.0.9 | 2019年8月28日 |
#260 in 操作系统
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 License,版本2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确说明,否则您提交的任何有意提交以包含在作品中的贡献,根据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" |
定义可能在夜间编译器上才能工作的一些内容(目前仅用于文档。) |