fix: repair Android Core MIX property bridge
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
OpenAI Codex
2026-09-03 11:07:18 +08:00
parent 5782574c8c
commit 4703d87e23
3 changed files with 26 additions and 2 deletions

View File

@@ -5,3 +5,7 @@
- 实现:最小 `NativeMapView.setStyleLayerFloatProperty(layerId, propertyName, value)`,JNI 通过 `Style::getLayer()` 与正式 `Layer::setProperty()` 更新 Core 属性;没有完整 RasterParticle Java peer。
- Host:MIX 不再查询 Java Layer peer,bridge 成功后才更新 `timeMix`。
- 未运行 Android Gradle/ADB;T4--T10 待用户验收。
## Android 编译修正
首次 Android 编译发现 `Layer::setProperty(..., static_cast<double>(value))` 触发未支持的 `Convertible<double>` / `ConversionTraits<double>`。Core 已有强类型 `RasterParticleLayer::setTimeMix(float)`;bridge 现确认 `raster-particle-time-mix` 与实际 layer 类型后直接调用该 setter,不新增 conversion trait。Kotlin `setTimeMix()` 不含 `Style.getLayer()`、`layer.setProperties()` 或 `PaintPropertyValue` 的 MIX 写入,bridge 成功后才更新 `timeMix`。

View File

@@ -13,3 +13,16 @@
```
APK:`platform/android/MapLibreAndroidTestApp/build/outputs/apk/opengl/debug/MapLibreAndroidTestApp-opengl-debug.apk`。T4--T10 仍待 Android 手工验收,状态不得判 PASS。
## Android 编译修正
第一次 Android 编译失败是因为 generic `Layer::setProperty()` 收到 `double`,而当前 conversion 系统没有 `Convertible<double>` / `ConversionTraits<double>` backing。最终使用已存在的强类型 `RasterParticleLayer::setTimeMix(float)`:JNI 先校验 property 名和 runtime Layer 类型,再调用 setter。未使用 generic Convertible,也没有新增 conversion trait。Kotlin 已完全删除 MIX 的 Java `Style.getLayer()` / `layer.setProperties()` 写入;JNI boolean 成功才写入 `timeMix`,失败保持原值。未修改 shader、Renderer、Field、ADVANCE;未运行 Android Gradle、ADB,未加入 Jest。
用户 x86_64 编译:
```bash
cd /mnt/sda1/MapLibreParticleLab/platform/android
./gradlew :MapLibreAndroidTestApp:assembleOpenglDebug -Pandroid.injected.build.abi=x86_64 --console=plain
```
APK:`./MapLibreAndroidTestApp/build/intermediates/apk/opengl/debug/MapLibreAndroidTestApp-opengl-debug.apk`。

View File

@@ -26,6 +26,7 @@
#include <mbgl/util/platform.hpp>
#include <mbgl/util/projection.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/style/layers/raster_particle_layer.hpp>
#include <mbgl/style/image.hpp>
#include <mbgl/style/filter.hpp>
#include <mbgl/renderer/query.hpp>
@@ -1112,10 +1113,16 @@ jni::jboolean NativeMapView::setStyleLayerFloatProperty(JNIEnv& env,
const jni::jfloat value) {
auto* layer = map->getStyle().getLayer(jni::Make<std::string>(env, layerId));
if (!layer) return false;
if (const auto error = layer->setProperty(jni::Make<std::string>(env, propertyName), static_cast<double>(value))) {
mbgl::Log::Error(mbgl::Event::JNI, "ParticleGPU: event=STYLE_PROPERTY_SET result=FAILURE " + error->message);
if (jni::Make<std::string>(env, propertyName) != "raster-particle-time-mix") {
mbgl::Log::Error(mbgl::Event::JNI, "ParticleGPU: event=STYLE_PROPERTY_SET result=UNSUPPORTED_PROPERTY");
return false;
}
auto* particleLayer = dynamic_cast<mbgl::style::RasterParticleLayer*>(layer);
if (!particleLayer) {
mbgl::Log::Error(mbgl::Event::JNI, "ParticleGPU: event=STYLE_PROPERTY_SET result=UNSUPPORTED_LAYER");
return false;
}
particleLayer->setTimeMix(value);
mbgl::Log::Info(mbgl::Event::JNI,
"ParticleGPU: event=STYLE_PROPERTY_SET layerId=" + jni::Make<std::string>(env, layerId) +
" property=" + jni::Make<std::string>(env, propertyName) + " value=" + std::to_string(value) +