Skip to content

Fix for nitro-modules 0.35 with Android #263

@Hyllesen

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions