SDK
ECHO Native Troubleshooting
Cause: An addon descriptor is missing a required field or contains invalid JSON. Fix:
ECHO Native Troubleshooting
Installation Issues
NativeAddonDescriptorValidationException on launch
Cause: An addon descriptor is missing a required field or contains invalid JSON. Fix:
- Check
logs/latest.logfor the exact field name and addon ID. - Open the addon jar and inspect
META-INF/echo.mod.json. - Ensure
id,version,entrypoint,side, andaccess.nativeClasspathare present and valid. - Re-package the addon after fixing the descriptor.
UnsupportedClassVersionError
Cause: Running with Java older than 25. Fix: Install Java 25 and point your launcher to it.
Loader does not discover an addon
Cause: The .echo-addon is not installed, descriptor is missing, or the release classpath is incomplete.
Fix:
- Confirm the package filename ends with
.echo-addonand is in the correct install folder. - Open the jar and verify
META-INF/echo.mod.jsonexists. - Check that
access.nativeClasspathincludes the packagedaddon.jar.
Runtime Issues
NoClassDefFoundError for an optional addon
Cause: Hard import of an optional addon class without EchoOptionalServices guard.
Fix: Replace direct references with service lookups or EchoOptionalServices:
// Wrong
TerminalService t = TerminalService.instance(); // crashes if absent
// Right
EchoOptionalServices.terminal().ifPresent(t -> t.registerCard(card));
Crash during lifecycle setup
Cause: Service registration throwing an exception prevents further addon boot. Fix:
- Wrap registration in try/catch and log instead of crash.
- Use
EchoNativeModuleLoadContext.registerService(serviceId, impl, surfaces...)fromregisterServices. - Check the addon's parity report for missing NeoForge bridge dependencies.
Networking packets not arriving
Cause: Packet descriptor missing side or channel mismatch.
Fix:
- Verify
EchoNetService.registerPacketDescriptor()was called during initialization. - Ensure the packet record implements
EchoPacketand has a validchannelfield. - Check that sender and receiver agree on schema version.
Build Issues
./gradlew check fails with contract errors
Cause: A registered service does not implement its declared contract. Fix:
- Compare the service class against the contract interface.
- Ensure the contract ID in
echo.mod.jsonmatches the runtime registration. - Confirm Native-first source does not import loader internals, Forge, Fabric, or NeoForge APIs.
./gradlew packageEchoNativeAddon produces no .echo-addon
Cause: Descriptor validation failed, the SDK plugin is not on the RC1 template path, or the project is still using an old template task name. Fix:
- Run
./gradlew clean check packageEchoNativeAddonand fix the first failing task. - Ensure
META-INF/echo.mod.jsondeclaresschema,id,version,entrypoint,side, andaccess.nativeClasspath. - Confirm
access.nativeClasspathincludesaddon.jar. - Use the generated
.echo-addonfrombuild/echo-native/addons/; do not install loose classes or a dev jar for release-mode testing.
Performance Issues
Stuttering or high tick times
Cause: An addon registered a heavy system without a RuntimeGuard budget. Fix:
- Check
echocore.tomlfor budget warnings. - Register a budget for your heavy system:
EchoCoreServices.runtimeGuard().registerBudget("echoexample:heavy_sim", 2.0);
- Split work across multiple ticks or use async datapack loading where possible.
Getting More Help
- Run
/echo export-diagnosticsin-game to produce a support bundle. - Open an issue using the Bug Report or Addon Author Support template.
- Include
latest.log,debug.log, the parity report, and your descriptor JSON.