diff --git a/android/gltfio-android/src/main/cpp/MaterialProvider.cpp b/android/gltfio-android/src/main/cpp/MaterialProvider.cpp
index 480a0455f9..7a8247b04e 100644
--- a/android/gltfio-android/src/main/cpp/MaterialProvider.cpp
+++ b/android/gltfio-android/src/main/cpp/MaterialProvider.cpp
@@ -34,3 +34,10 @@ Java_com_google_android_filament_gltfio_MaterialProvider_nDestroyMaterialProvide
auto provider = (MaterialProvider*) nativeProvider;
delete provider;
}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_google_android_filament_gltfio_MaterialProvider_nDestroyMaterials(JNIEnv*, jclass,
+ jlong nativeProvider) {
+ auto provider = (MaterialProvider*) nativeProvider;
+ provider->destroyMaterials();
+}
diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java
index a40db6fa3a..927a8d0be8 100644
--- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java
+++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/AssetLoader.java
@@ -78,9 +78,10 @@ import java.nio.Buffer;
public class AssetLoader {
private long mNativeObject;
private Engine mEngine;
+ private MaterialProvider mMaterialCache;
/**
- * Constructs an AssetLoader that can be used to create and destroy instances of
+ * Constructs an AssetLoader that can be used to create and destroy instances of
* {@link FilamentAsset}.
*
* @param engine the engine that the loader should pass to builder objects
@@ -100,6 +101,7 @@ public class AssetLoader {
}
mEngine = engine;
+ mMaterialCache = generator;
}
/**
@@ -107,6 +109,7 @@ public class AssetLoader {
*/
public void destroy() {
nDestroyAssetLoader(mNativeObject);
+ mMaterialCache.destroyMaterials();
mNativeObject = 0;
}
diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java
index b59d73852f..a4d65e4ffa 100644
--- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java
+++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java
@@ -47,10 +47,21 @@ public class MaterialProvider {
mNativeObject = 0;
}
+ /**
+ * Destroys all cached materials.
+ *
+ * This is not called automatically when MaterialProvider is destroyed, which allows
+ * clients to take ownership of the cache if desired.
+ */
+ public void destroyMaterials() {
+ nDestroyMaterials(mNativeObject);
+ }
+
long getNativeObject() {
return mNativeObject;
}
private static native long nCreateMaterialProvider(long nativeEngine);
private static native void nDestroyMaterialProvider(long nativeProvider);
+ private static native void nDestroyMaterials(long nativeProvider);
}
diff --git a/libs/gltfio/include/gltfio/MaterialProvider.h b/libs/gltfio/include/gltfio/MaterialProvider.h
index 58be327681..9b9374dfec 100644
--- a/libs/gltfio/include/gltfio/MaterialProvider.h
+++ b/libs/gltfio/include/gltfio/MaterialProvider.h
@@ -114,6 +114,11 @@ enum MaterialSource {
* - The \c UbershaderLoader implementation uses a small number of pre-built materials with complex
* fragment shaders, but does not require any run time work or usage of filamat. See
* createUbershaderLoader().
+ *
+ * Both implementations of MaterialProvider maintain a small cache of materials which must be
+ * explicitly freed using destroyMaterials(). These materials are not freed automatically when the
+ * MaterialProvider is destroyed, which allows clients to take ownership if desired.
+ *
*/
class MaterialProvider {
public: