blinc_platform_android

Crates.ioblinc_platform_android
lib.rsblinc_platform_android
version0.1.12
created_at2026-01-14 18:57:16.763933+00
updated_at2026-01-19 01:07:46.861248+00
descriptionBlinc Android platform - native activity, JNI bridge, and input handling
homepage
repositoryhttps://github.com/project-blinc/Blinc
max_upload_size
id2043465
size137,861
'Damilare Darmie Akinlaja (darmie)

documentation

https://docs.rs/blinc_platform_android

README

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

Commit count: 444

cargo fmt