Skip to main content

bindings-synchronization

Guidelines and SOP for synchronizing public C++ API changes (methods, enums, options structs) to Java (Android JNI) and JavaScript/TypeScript (Web/WASM Embind).

Source facts

Repository
google/filament
Last source activity
September 20, 2026 at 05:38
Detected SKILL.md language
English
Stars
20,655
Forks
2,283

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
bindings-synchronization
description
Guidelines and SOP for synchronizing public C++ API changes (methods, enums, options structs) to Java (Android JNI) and JavaScript/TypeScript (Web/WASM Embind).
# Cross-Platform Language Bindings Synchronization When making changes to public Filament C++ APIs, AI agents **must** ensure the changes are mirrored in the Java and JavaScript/TypeScript binding layers. --- ## 1. Trigger Conditions You must check and update the language bindings if your changes touch any public headers under `filament/include/filament/`, specifically: - **New/Modified/Deleted Methods** on core classes (e.g., `View`, `Engine`, `Camera`, `LightManager`, `RenderableManager`). - **Options Structs** (e.g., `AmbientOcclusionOptions`, `BloomOptions`, `FogOptions`). > [!IMPORTANT] > If you modify options structs defined in `filament/include/filament/Options.h`: > 1. **Run `apigen`** to regenerate `View.java` and `View.cpp` (which host the Java POJO options structs and JNI bridges): > ```bash > python3 tools/apigen/generate_android.py -j > ``` > 2. **Run `beamsplitter`** to update JavaScript/TypeScript bindings and C++ JSON settings serialization: > ```bash > cd tools/beamsplitter && go run . > ``` - **Enums & Constants** (e.g., `BlendMode`, `QualityLevel`, `AntiAliasing` under `filament/include/filament/` or nested inside classes). --- ## 2. Java & Android JNI Synchronization All JNI JNI-exported functions use automatic symbol resolution (dynamic mapping), meaning they are mapped by signature rather than a static registration table. ### File Mappings - **Java Class**: `android/filament-android/src/main/java/com/google/android/filament/<ClassName>.java` - **JNI C++ Wrapper**: `android/filament-android/src/main/cpp/<ClassName>.cpp` ### Guidelines 1. **API Consistency**: Keep method visibility `public` (unless the API is strictly internal to the Java package). Follow Java naming conventions (camelCase). 2. **Getter/Setter Completeness**: If you add a Setter (e.g., `setFoo`), always add the corresponding Getter (e.g., `isFoo` or `getFoo`). 3. **JNI Signature**: - Native declarations in Java must be `private static native`. - The corresponding C++ function in JNI must be decorated with `extern "C" JNIEXPORT <ReturnType> JNICALL Java_com_google_android_filament_<ClassName>_<NativeMethodName>`. - Return values from native C++ booleans should be cast to `jboolean` using `(jboolean)` or `static_cast<jboolean>()`. --- ## 3. JavaScript & TypeScript Synchronization Filament uses Emscripten's Embind to export C++ APIs to JS. ### File Mappings - **Embind Source**: `web/filament-js/jsbindings.cpp` - **Enums Embind Source**: `web/filament-js/jsenums.cpp` - **TypeScript Definition**: `web/filament-js/filament.d.ts` - **JS Extension Wrappers**: `web/filament-js/extensions.js` ### Guidelines 1. **Embind Registration**: - Register member functions in `jsbindings.cpp` within the corresponding `class_<ClassName>("<JSClassName>")` block using `.function("methodName", &ClassName::methodName)`. 2. **TypeScript Declarations**: - Always update `filament.d.ts` to match any changes. Every bound C++ method should have a corresponding declaration inside `export class <ClassName>` to avoid IDE type errors. 3. **Complex Option Structs**: - If you modify or add fields to an options struct (like `BloomOptions`), make sure to: - Register the new fields in `jsbindings.cpp` using `.field("fieldName", &ClassName::Options::fieldName)`. - Update the TypeScript interface in `filament.d.ts` to include the new properties. - Check if `extensions.js` contains a prototype-overrides wrapper for merging the options (e.g., `Filament.View.prototype.setBloomOptions`). Update the default options object if needed. --- ## 4. Verification Check Before concluding a task: 1. Double-check JNI signature signatures against the Java class. 2. Verify that type bindings and return types match up. 3. Verify that TS definitions in `filament.d.ts` are 100% synchronized.
View on GitHub