2 releases
| 0.1.12 | Jan 19, 2026 |
|---|---|
| 0.1.1 | Jan 14, 2026 |
#22 in Android
Used in blinc_app
710KB
14K
SLoC
blinc_platform_android
Part of the Blinc UI Framework
This crate is a component of Blinc, a GPU-accelerated UI framework for Rust. For full documentation and guides, visit the Blinc documentation.
Android platform implementation for Blinc UI.
Overview
blinc_platform_android provides native Android integration using the NDK, including activity lifecycle, touch input, and GPU rendering via Vulkan.
Supported Platforms
- Android 7.0+ (API level 24+)
- ARM64 and x86_64 architectures
Features
- Native Activity: Full NDK integration
- JNI Bridge: Java interoperability
- Touch Input: Multi-touch support
- Vulkan Rendering: Hardware-accelerated graphics
- Asset Loading: Load from APK resources
- Lifecycle: Proper activity state handling
Quick Start
use blinc_platform_android::android_main;
#[no_mangle]
pub extern "C" fn ANativeActivity_onCreate(
activity: *mut ANativeActivity,
saved_state: *mut c_void,
saved_state_size: usize,
) {
android_main(activity, |ctx| {
// Build your UI
div()
.w_full()
.h_full()
.child(text("Hello Android!"))
});
}
Project Setup
Cargo.toml
[lib]
crate-type = ["cdylib"]
[dependencies]
blinc_platform_android = "0.1"
build.gradle
android {
defaultConfig {
ndk {
abiFilters 'arm64-v8a', 'x86_64'
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
}
AndroidManifest.xml
<application
android:hasCode="false"
android:allowBackup="true">
<activity
android:name="android.app.NativeActivity"
android:exported="true"
android:configChanges="orientation|screenSize|keyboardHidden">
<meta-data
android:name="android.app.lib_name"
android:value="myapp" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Touch Handling
fn handle_touch(event: TouchEvent) {
for pointer in event.pointers() {
match pointer.action {
PointerAction::Down => {
// Touch started
}
PointerAction::Move => {
// Touch moved
}
PointerAction::Up => {
// Touch ended
}
}
}
}
Asset Loading
use blinc_platform_android::AndroidAssetLoader;
let loader = AndroidAssetLoader::new(activity);
// Load from assets/ directory in APK
let data = loader.load("images/logo.png")?;
// Check if asset exists
if loader.exists("config.json") {
let config = loader.load("config.json")?;
}
Lifecycle
android_main(activity, |ctx| {
ctx.on_start(|| {
// Activity started
});
ctx.on_resume(|| {
// Activity resumed
});
ctx.on_pause(|| {
// Activity paused - save state
});
ctx.on_stop(|| {
// Activity stopped
});
ctx.on_destroy(|| {
// Cleanup
});
build_ui()
});
Building
# Build for Android
cargo ndk -t arm64-v8a -t x86_64 -o ./app/src/main/jniLibs build --release
# Or using cargo-apk
cargo apk build --release
Requirements
- Android SDK (API level 24+)
- Android NDK r21+
- Rust with Android targets:
rustup target add aarch64-linux-android rustup target add x86_64-linux-android - cargo-ndk:
cargo install cargo-ndk
License
MIT OR Apache-2.0
Dependencies
~8–49MB
~648K SLoC