Skip to content

Fix for nitro-modules 0.35 with Android #263

Description

@Hyllesen

I had AI make me this patch for my react-native-nitro-modules 0.35.2 - I am too embarrassed to make a pull request with this, but perhaps it can be of use to someone:

place in patches/@baronha+react-native-multiple-image-picker+2.2.5.patch

Ensure you have
"postinstall": "patch-package",

Inside your package.json under scripts

diff --git a/node_modules/@baronha/react-native-multiple-image-picker/android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt b/node_modules/@baronha/react-native-multiple-image-picker/android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt
index cdd8ca7..3911ff5 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt
+++ b/node_modules/@baronha/react-native-multiple-image-picker/android/src/main/java/com/margelo/nitro/multipleimagepicker/MultipleImagePickerImp.kt
@@ -385,7 +385,7 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
                 }
 
                 override fun onCancel() {
-//                    rejected(0.0)
+                    rejected(0.0)
                 }
             })
     }
diff --git a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.cpp b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.cpp
index a6e6209..8581355 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.cpp
+++ b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.cpp
@@ -20,35 +20,43 @@
 #include "JFunc_void_double.hpp"
 #include "JFunc_void_CropResult.hpp"
 #include "JFunc_void_CameraResult.hpp"
-#include <NitroModules/JNISharedPtr.hpp>
 #include <NitroModules/DefaultConstructableObject.hpp>
 
 namespace margelo::nitro::multipleimagepicker {
 
 int initialize(JavaVM* vm) {
+  return facebook::jni::initialize(vm, []() {
+    ::margelo::nitro::multipleimagepicker::registerAllNatives();
+  });
+}
+
+struct JHybridMultipleImagePickerSpecImpl: public jni::JavaClass<JHybridMultipleImagePickerSpecImpl, JHybridMultipleImagePickerSpec::JavaPart> {
+  static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/multipleimagepicker/MultipleImagePicker;";
+  static std::shared_ptr<JHybridMultipleImagePickerSpec> create() {
+    static auto constructorFn = javaClassStatic()->getConstructor<JHybridMultipleImagePickerSpecImpl::javaobject()>();
+    jni::local_ref<JHybridMultipleImagePickerSpec::JavaPart> javaPart = javaClassStatic()->newObject(constructorFn);
+    return javaPart->getJHybridMultipleImagePickerSpec();
+  }
+};
+
+void registerAllNatives() {
   using namespace margelo::nitro;
   using namespace margelo::nitro::multipleimagepicker;
-  using namespace facebook;
-
-  return facebook::jni::initialize(vm, [] {
-    // Register native JNI methods
-    margelo::nitro::multipleimagepicker::JHybridMultipleImagePickerSpec::registerNatives();
-    margelo::nitro::multipleimagepicker::JFunc_void_std__vector_PickerResult__cxx::registerNatives();
-    margelo::nitro::multipleimagepicker::JFunc_void_double_cxx::registerNatives();
-    margelo::nitro::multipleimagepicker::JFunc_void_CropResult_cxx::registerNatives();
-    margelo::nitro::multipleimagepicker::JFunc_void_CameraResult_cxx::registerNatives();
-
-    // Register Nitro Hybrid Objects
-    HybridObjectRegistry::registerHybridObjectConstructor(
-      "MultipleImagePicker",
-      []() -> std::shared_ptr<HybridObject> {
-        static DefaultConstructableObject<JHybridMultipleImagePickerSpec::javaobject> object("com/margelo/nitro/multipleimagepicker/MultipleImagePicker");
-        auto instance = object.create();
-        auto globalRef = jni::make_global(instance);
-        return JNISharedPtr::make_shared_from_jni<JHybridMultipleImagePickerSpec>(globalRef);
-      }
-    );
-  });
+
+  // Register native JNI methods
+  margelo::nitro::multipleimagepicker::JHybridMultipleImagePickerSpec::CxxPart::registerNatives();
+  margelo::nitro::multipleimagepicker::JFunc_void_std__vector_PickerResult__cxx::registerNatives();
+  margelo::nitro::multipleimagepicker::JFunc_void_double_cxx::registerNatives();
+  margelo::nitro::multipleimagepicker::JFunc_void_CropResult_cxx::registerNatives();
+  margelo::nitro::multipleimagepicker::JFunc_void_CameraResult_cxx::registerNatives();
+
+  // Register Nitro Hybrid Objects
+  HybridObjectRegistry::registerHybridObjectConstructor(
+    "MultipleImagePicker",
+    []() -> std::shared_ptr<HybridObject> {
+      return JHybridMultipleImagePickerSpecImpl::create();
+    }
+  );
 }
 
 } // namespace margelo::nitro::multipleimagepicker
diff --git a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.hpp b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.hpp
index 073381a..0af4b7c 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.hpp
+++ b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/MultipleImagePickerOnLoad.hpp
@@ -20,6 +20,22 @@ namespace margelo::nitro::multipleimagepicker {
    * }
    * ```
    */
+  [[deprecated("Use registerAllNatives() instead.")]]
   int initialize(JavaVM* vm);
 
+  /**
+   * Register the native (C++) part of MultipleImagePicker, and autolinks all Hybrid Objects.
+   * Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
+   * inside a `facebook::jni::initialize(vm, ...)` call.
+   * Example:
+   * ```cpp (cpp-adapter.cpp)
+   * JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
+   *   return facebook::jni::initialize(vm, []() {
+   *     margelo::nitro::multipleimagepicker::registerAllNatives();
+   *   });
+   * }
+   * ```
+   */
+  void registerAllNatives();
+
 } // namespace margelo::nitro::multipleimagepicker
diff --git a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp
index 1e68abf..901376e 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp
+++ b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.cpp
@@ -99,19 +99,31 @@ namespace margelo::nitro::multipleimagepicker { struct CameraResult; }
 
 namespace margelo::nitro::multipleimagepicker {
 
-  jni::local_ref<JHybridMultipleImagePickerSpec::jhybriddata> JHybridMultipleImagePickerSpec::initHybrid(jni::alias_ref<jhybridobject> jThis) {
+  std::shared_ptr<JHybridMultipleImagePickerSpec> JHybridMultipleImagePickerSpec::JavaPart::getJHybridMultipleImagePickerSpec() {
+    auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
+    auto castHybridObject = std::dynamic_pointer_cast<JHybridMultipleImagePickerSpec>(hybridObject);
+    if (castHybridObject == nullptr) [[unlikely]] {
+      throw std::runtime_error("Failed to downcast JHybridObject to JHybridMultipleImagePickerSpec!");
+    }
+    return castHybridObject;
+  }
+
+  jni::local_ref<JHybridMultipleImagePickerSpec::CxxPart::jhybriddata> JHybridMultipleImagePickerSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
     return makeCxxInstance(jThis);
   }
 
-  void JHybridMultipleImagePickerSpec::registerNatives() {
-    registerHybrid({
-      makeNativeMethod("initHybrid", JHybridMultipleImagePickerSpec::initHybrid),
-    });
+  std::shared_ptr<JHybridObject> JHybridMultipleImagePickerSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
+    auto castJavaPart = jni::dynamic_ref_cast<JHybridMultipleImagePickerSpec::JavaPart>(javaPart);
+    if (castJavaPart == nullptr) [[unlikely]] {
+      throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridMultipleImagePickerSpec::JavaPart!");
+    }
+    return std::make_shared<JHybridMultipleImagePickerSpec>(castJavaPart);
   }
 
-  size_t JHybridMultipleImagePickerSpec::getExternalMemorySize() noexcept {
-    static const auto method = javaClassStatic()->getMethod<jlong()>("getMemorySize");
-    return method(_javaPart);
+  void JHybridMultipleImagePickerSpec::CxxPart::registerNatives() {
+    registerHybrid({
+      makeNativeMethod("initHybrid", JHybridMultipleImagePickerSpec::CxxPart::initHybrid),
+    });
   }
 
   // Properties
@@ -119,15 +131,15 @@ namespace margelo::nitro::multipleimagepicker {
 
   // Methods
   void JHybridMultipleImagePickerSpec::openPicker(const NitroConfig& config, const std::function<void(const std::vector<PickerResult>& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) {
-    static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<JNitroConfig> /* config */, jni::alias_ref<JFunc_void_std__vector_PickerResult_::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openPicker_cxx");
+    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JNitroConfig> /* config */, jni::alias_ref<JFunc_void_std__vector_PickerResult_::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openPicker_cxx");
     method(_javaPart, JNitroConfig::fromCpp(config), JFunc_void_std__vector_PickerResult__cxx::fromCpp(resolved), JFunc_void_double_cxx::fromCpp(rejected));
   }
   void JHybridMultipleImagePickerSpec::openCrop(const std::string& image, const NitroCropConfig& config, const std::function<void(const CropResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) {
-    static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* image */, jni::alias_ref<JNitroCropConfig> /* config */, jni::alias_ref<JFunc_void_CropResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCrop_cxx");
+    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* image */, jni::alias_ref<JNitroCropConfig> /* config */, jni::alias_ref<JFunc_void_CropResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCrop_cxx");
     method(_javaPart, jni::make_jstring(image), JNitroCropConfig::fromCpp(config), JFunc_void_CropResult_cxx::fromCpp(resolved), JFunc_void_double_cxx::fromCpp(rejected));
   }
   void JHybridMultipleImagePickerSpec::openPreview(const std::vector<MediaPreview>& media, double index, const NitroPreviewConfig& config, const std::function<void(double /* index */)>& onLongPress) {
-    static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<jni::JArrayClass<JMediaPreview>> /* media */, double /* index */, jni::alias_ref<JNitroPreviewConfig> /* config */, jni::alias_ref<JFunc_void_double::javaobject> /* onLongPress */)>("openPreview_cxx");
+    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JArrayClass<JMediaPreview>> /* media */, double /* index */, jni::alias_ref<JNitroPreviewConfig> /* config */, jni::alias_ref<JFunc_void_double::javaobject> /* onLongPress */)>("openPreview_cxx");
     method(_javaPart, [&]() {
       size_t __size = media.size();
       jni::local_ref<jni::JArrayClass<JMediaPreview>> __array = jni::JArrayClass<JMediaPreview>::newArray(__size);
@@ -139,7 +151,7 @@ namespace margelo::nitro::multipleimagepicker {
     }(), index, JNitroPreviewConfig::fromCpp(config), JFunc_void_double_cxx::fromCpp(onLongPress));
   }
   void JHybridMultipleImagePickerSpec::openCamera(const NitroCameraConfig& config, const std::function<void(const CameraResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) {
-    static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<JNitroCameraConfig> /* config */, jni::alias_ref<JFunc_void_CameraResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCamera_cxx");
+    static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<JNitroCameraConfig> /* config */, jni::alias_ref<JFunc_void_CameraResult::javaobject> /* resolved */, jni::alias_ref<JFunc_void_double::javaobject> /* rejected */)>("openCamera_cxx");
     method(_javaPart, JNitroCameraConfig::fromCpp(config), JFunc_void_CameraResult_cxx::fromCpp(resolved), JFunc_void_double_cxx::fromCpp(rejected));
   }
 
diff --git a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp
index 000913c..84dec68 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp
+++ b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/c++/JHybridMultipleImagePickerSpec.hpp
@@ -13,35 +13,37 @@
 
 
 
-
 namespace margelo::nitro::multipleimagepicker {
 
   using namespace facebook;
 
-  class JHybridMultipleImagePickerSpec: public jni::HybridClass<JHybridMultipleImagePickerSpec, JHybridObject>,
-                                        public virtual HybridMultipleImagePickerSpec {
+  class JHybridMultipleImagePickerSpec: public virtual HybridMultipleImagePickerSpec, public virtual JHybridObject {
   public:
-    static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec;";
-    static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
-    static void registerNatives();
-
-  protected:
-    // C++ constructor (called from Java via `initHybrid()`)
-    explicit JHybridMultipleImagePickerSpec(jni::alias_ref<jhybridobject> jThis) :
-      HybridObject(HybridMultipleImagePickerSpec::TAG),
-      _javaPart(jni::make_global(jThis)) {}
+    struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
+      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec;";
+      std::shared_ptr<JHybridMultipleImagePickerSpec> getJHybridMultipleImagePickerSpec();
+    };
+    struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
+      static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec$CxxPart;";
+      static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
+      static void registerNatives();
+      using HybridBase::HybridBase;
+    protected:
+      std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
+    };
 
   public:
+    explicit JHybridMultipleImagePickerSpec(const jni::local_ref<JHybridMultipleImagePickerSpec::JavaPart>& javaPart):
+      HybridObject(HybridMultipleImagePickerSpec::TAG),
+      JHybridObject(javaPart),
+      _javaPart(jni::make_global(javaPart)) {}
     ~JHybridMultipleImagePickerSpec() override {
       // Hermes GC can destroy JS objects on a non-JNI Thread.
       jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
     }
 
   public:
-    size_t getExternalMemorySize() noexcept override;
-
-  public:
-    inline const jni::global_ref<JHybridMultipleImagePickerSpec::javaobject>& getJavaPart() const noexcept {
+    inline const jni::global_ref<JHybridMultipleImagePickerSpec::JavaPart>& getJavaPart() const noexcept {
       return _javaPart;
     }
 
@@ -57,9 +59,7 @@ namespace margelo::nitro::multipleimagepicker {
     void openCamera(const NitroCameraConfig& config, const std::function<void(const CameraResult& /* result */)>& resolved, const std::function<void(double /* reject */)>& rejected) override;
 
   private:
-    friend HybridBase;
-    using HybridBase::HybridBase;
-    jni::global_ref<JHybridMultipleImagePickerSpec::javaobject> _javaPart;
+    jni::global_ref<JHybridMultipleImagePickerSpec::JavaPart> _javaPart;
   };
 
 } // namespace margelo::nitro::multipleimagepicker
diff --git a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec.kt b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec.kt
index 47aa765..8042719 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec.kt
+++ b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/android/kotlin/com/margelo/nitro/multipleimagepicker/HybridMultipleImagePickerSpec.kt
@@ -24,18 +24,6 @@ import com.margelo.nitro.core.*
   "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
 )
 abstract class HybridMultipleImagePickerSpec: HybridObject() {
-  @DoNotStrip
-  private var mHybridData: HybridData = initHybrid()
-
-  init {
-    super.updateNative(mHybridData)
-  }
-
-  override fun updateNative(hybridData: HybridData) {
-    mHybridData = hybridData
-    super.updateNative(hybridData)
-  }
-
   // Properties
   
 
@@ -76,9 +64,23 @@ abstract class HybridMultipleImagePickerSpec: HybridObject() {
     return __result
   }
 
-  private external fun initHybrid(): HybridData
+  // Default implementation of `HybridObject.toString()`
+  override fun toString(): String {
+    return "[HybridObject MultipleImagePicker]"
+  }
+  
+  // C++ backing class
+  @DoNotStrip
+  @Keep
+  protected open class CxxPart(javaPart: HybridMultipleImagePickerSpec): HybridObject.CxxPart(javaPart) {
+    // C++ JHybridMultipleImagePickerSpec::CxxPart::initHybrid(...)
+    external override fun initHybrid(): HybridData
+  }
+  override fun createCxxPart(): CxxPart {
+    return CxxPart(this)
+  }
 
   companion object {
-    private const val TAG = "HybridMultipleImagePickerSpec"
+    protected const val TAG = "HybridMultipleImagePickerSpec"
   }
 }
diff --git a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Umbrella.hpp b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Umbrella.hpp
index 130d74f..a19bab3 100644
--- a/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Umbrella.hpp
+++ b/node_modules/@baronha/react-native-multiple-image-picker/nitrogen/generated/ios/MultipleImagePicker-Swift-Cxx-Umbrella.hpp
@@ -86,7 +86,7 @@ namespace margelo::nitro::multipleimagepicker { enum class Theme; }
 
 // Common C++ types used in Swift
 #include <NitroModules/ArrayBufferHolder.hpp>
-#include <NitroModules/AnyMapHolder.hpp>
+#include <NitroModules/AnyMap.hpp>
 #include <NitroModules/RuntimeError.hpp>
 
 // Forward declarations of Swift defined types

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions