Android app
The Android app lives in Apps/Android/. It is an early phone shell: pairing,
HEVC live view, GPU looks, scopes, camera writes, and media. It is not on
Google Play yet. Join the closed-beta waitlist on
openpocketcine.app. iOS is the daily driver.
How Swift reaches Android
Section titled “How Swift reaches Android”Business logic stays in OpenPocketViewCore. Android follows the OpenZCine
pattern, not Skip/SKIE:
- Portable Swift core (no SwiftUI, UIKit, or Android imports).
OpenPocketCineAndroidFacade— session + hand-written JNI (@_cdecl).- Gradle
:app:stageSwiftCore(just android-core) buildsaarch64-unknown-linux-android29and stageslibOpenPocketCineAndroid.so. arm64-v8a only. Toolchain pin: Swift 6.3.3. - Kotlin
core-apiwraps JNI. Kotlin does not pack protocol bytes.
Build recipes: Setup. The living JNI/I/O notes:
ANDROID.md.
Operator surface
Section titled “Operator surface”Chrome, assists, capture, Operator Setup, and media are meant to match iOS.
The gimbal stick and zoom chip sit together as a cluster in the
trailing-bottom of the picture, same as iOS. D-Log2 cannot zoom while
rolling — the chip grays and tap/pinch toast; idle still hops to D-Log
off 1×.
Long-press LUT for the same exposure compensation as iOS (−3…+3 at ½ stop,
input-referred before the cube). Next/prev with LUT on keeps the grade on
the same GLES host (ExoPlayer writes an OES surface; LUT / PEAK / FALSE /
ZEBRA grade in LiveFeedEffectsSession like live — TextureView is only the
window). Auto on a clip reads com.dji.camera.ColorGammaSxS
from the original take like iOS — not the LRF/XRF sidecar (Rec.709 even
for log). Shot color is stored with the cached clip. A Proxy tag means
only the 720p sidecar is on the phone. Storage Full Resolution Caching
matches iOS. Share/save is the original camera file — LUT bake
(and Bake exposure) is iOS only.
Exceptions (Frame.io, MetalFX, iOS 26 Liquid Glass, …) are listed in
docs/PARITY.md.
Live picture: Vulkan when the device can init it; GLES fallback. HUD liquid
glass is Kyant on API 33+ / ≥4 GB; older or low-RAM devices stay on solid frost.
Present path matches iOS FeedPresentPolicy (skip duplicate timestamps, keep
the last frame on freeze, one live-enable write at a time).
Wi-Fi passwords stay in Keystore, not saved-camera JSON. Pairing and live view need a physical Android phone.
What not to copy from OpenZCine Android
Section titled “What not to copy from OpenZCine Android”Nikon PTP-IP, AccessorySetupKit, OCR SSID scanner, USB-C/HDMI paths.