Skip to content

Output Files

This content is for v1. Switch to the latest version for up-to-date documentation.

Defaults to native/generated/ (configured via cpp_wire_output in dart_cpp_bridge.yaml):

native/generated/
├── wire_dispatch.hpp # Dispatch function declarations
├── wire_dispatch.cpp # Dispatch implementation (frame decoding, method routing, response encoding)
└── ir.json # Intermediate representation (for debugging)

Generated dispatch code handles:

  • Frame decoding (ByteReader)
  • Method routing (switch (method_id))
  • Parameter deserialization
  • Calling business functions
  • Return value serialization
  • Error capture and encoding

Defaults to lib/src/native_gen/ (configured via dart_output in dart_cpp_bridge.yaml):

lib/src/native_gen/
├── api/
│ ├── init.dart # init / dispose / BridgeApi singleton
│ ├── bridge_api.dart # corresponds to native/api/bridge_api.h
│ ├── counter.dart # corresponds to native/api/counter.h
│ ├── foreign_api.dart # corresponds to native/api/foreign_api.h
│ └── multi_runtime_api.dart # corresponds to native/api/multi_runtime_api.h
├── dcb_bindings.dart # FFI native symbol bindings
└── dcb_generated.dart # Method IDs, shared codec, internal implementation

In other words: native/api/{name}.h generates lib/src/native_gen/api/{name}.dart.

Import the package’s root export file:

import 'package:codegen_demo/codegen_demo.dart';

lib/codegen_demo.dart re-exports everything under api/.

Each generated Dart API file still follows the three-layer pattern internally:

Layer Location Purpose
Top-level functions api/{name}.dart initBridge(), add(), …
Singleton api/init.dart, etc. BridgeApi.instance
Implementation dcb_generated.dart Method IDs, codec logic
import 'package:my_app/codegen_demo.dart';
void main() async {
await initBridge();
final result = await add(1, 2);
print(result); // 3
disposeBridge();
}

Business implementation stays in user-written files:

native/api_impl/bridge_api.cpp # User-written implementation

The code generator does not modify these files.