---
name: google-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)."
license: "Apache-2.0"
metadata:
  decimalai-skill-id: "226754ea-eff9-4747-8a0c-40481a090945"
  decimalai-version-id: "197e6a0a-cf11-4f4d-b3d0-f6cbfa51b974"
  decimalai-version: "2"
  decimalai-body-sha256: "43e04f75d2493cc8ed5e23f6010c419e520f7796421cb3b59400d221dd2b519c"
  decimalai-name: "google/bindings-synchronization"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "coding"
  decimalai-source: "https://app.decimal.ai/s/google-bindings-synchronization@2/SKILL.md"
---
# 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.
