diff --git a/packages/nitrogen/src/syntax/kotlin/KotlinHybridObject.ts b/packages/nitrogen/src/syntax/kotlin/KotlinHybridObject.ts index 0aa73999a..c75f9dbe8 100644 --- a/packages/nitrogen/src/syntax/kotlin/KotlinHybridObject.ts +++ b/packages/nitrogen/src/syntax/kotlin/KotlinHybridObject.ts @@ -45,7 +45,6 @@ ${createFileMetadataString(`${name.HybridTSpec}.kt`)} package ${javaPackage} -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -67,14 +66,9 @@ abstract class ${name.HybridTSpec}: ${kotlinBase}() { private var mHybridData: HybridData = initHybrid() init { - // Pass this \`HybridData\` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridBaseSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridBaseSpec.kt index b34e1e6d0..2947eafab 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridBaseSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridBaseSpec.kt @@ -7,7 +7,6 @@ package com.margelo.nitro.image -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -29,14 +28,9 @@ abstract class HybridBaseSpec: HybridObject() { private var mHybridData: HybridData = initHybrid() init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridChildSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridChildSpec.kt index 1000a6129..4db5f9eb4 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridChildSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridChildSpec.kt @@ -7,7 +7,6 @@ package com.margelo.nitro.image -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -29,14 +28,9 @@ abstract class HybridChildSpec: HybridBaseSpec() { private var mHybridData: HybridData = initHybrid() init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt index 4af1ccc2d..19e85d4c8 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt @@ -7,7 +7,6 @@ package com.margelo.nitro.image -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -29,14 +28,9 @@ abstract class HybridImageFactorySpec: HybridObject() { private var mHybridData: HybridData = initHybrid() init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt index e0c7da442..92c50f70a 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt @@ -7,7 +7,6 @@ package com.margelo.nitro.image -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -29,14 +28,9 @@ abstract class HybridImageSpec: HybridObject() { private var mHybridData: HybridData = initHybrid() init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt index 46f891484..8bd416dac 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestObjectSwiftKotlinSpec.kt @@ -7,7 +7,6 @@ package com.margelo.nitro.image -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -29,14 +28,9 @@ abstract class HybridTestObjectSwiftKotlinSpec: HybridObject() { private var mHybridData: HybridData = initHybrid() init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestViewSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestViewSpec.kt index 65787c093..f12350368 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestViewSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridTestViewSpec.kt @@ -7,7 +7,6 @@ package com.margelo.nitro.image -import android.util.Log import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip @@ -30,14 +29,9 @@ abstract class HybridTestViewSpec: HybridView() { private var mHybridData: HybridData = initHybrid() init { - // Pass this `HybridData` through to it's base class, - // to represent inheritance to JHybridObject on C++ side super.updateNative(mHybridData) } - /** - * Call from a child class to initialize HybridData with a child. - */ override fun updateNative(hybridData: HybridData) { mHybridData = hybridData super.updateNative(hybridData) diff --git a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt index a90518660..cfbd8ce28 100644 --- a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt +++ b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt @@ -9,7 +9,7 @@ import com.facebook.proguard.annotations.DoNotStrip */ @Keep @DoNotStrip -abstract class HybridObject: ExtendableHybridClass { +abstract class HybridObject { /** * Get the memory size of the Kotlin instance (plus any external heap allocations), * in bytes. @@ -39,10 +39,14 @@ abstract class HybridObject: ExtendableHybridClass { private var mHybridData: HybridData? = null /** - * Must be called in the constructor of a subclass of `HybridObject`, to initialize the C++ - * `JHybridObject` with a subclass of it. + * If `HybridObject` is subclassed, the sub-class needs to create it's own `HybridData` + * with a C++ `jni::HybridClass` representing the subclass directly. + * Then, that `HybridData` must be passed upwards to `HybridObject` using `updateNative(..)`. + * + * This must happen for each sub/base class in the whole inheritance chain to ensure + * overrides and type-erasure works as expected. */ - override fun updateNative(hybridData: HybridData) { + protected open fun updateNative(hybridData: HybridData) { mHybridData = hybridData } } diff --git a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/utils/ExtendableHybridClass.kt b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/utils/ExtendableHybridClass.kt deleted file mode 100644 index 1529558ea..000000000 --- a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/utils/ExtendableHybridClass.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.margelo.nitro.core - -import com.facebook.jni.HybridData - -/** - * Represents an fbjni Hybrid Class (aka a Java class with an accompanying C++ class) - * that supports inheritance. - * - * Each fbjni Hybrid Class initializes it's `mHybridData` using an `initHybrid()` method, - * which initializes the respective C++ class this was bound to. - - * Assuming we have Java class `B` which extends Java class `A`, and a C++ - * inheritance chain that reflects the Java inheritance chain (C++ class `B` which extends C++ class `A`), - * we would have two `initHybrid()` methods - one for `A` and one for `B`. - * - When you initialize an instance of `A`, it will initialize `A`'s C++ part. - * - When you initialize an instance of `B`, it will initialize `B`'s C++ part, as well as `A`'s C++ part, since - * the native `A.initHybrid()` method cannot be overridden in `B` - both have their own `initHybrid()` methods! - * - * To fix this issue, we have `ExtendableHybridClass`. In an extendable HybridClass, we initialize `mHybridData`, - * but we pass it upwards the inheritance chain after initializing self using `updateNative(mHybridData)`. - * This way the actual `mHybridData` instance is the lowest class in the chain - `B`. - */ -interface ExtendableHybridClass { - /** - * Update the `hybridData` (C++ part) this Hybrid Class is referencing. - * Call this with `hybridData` from a subclass to properly fill in the inheritance chain. - */ - fun updateNative(hybridData: HybridData) -} diff --git a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/views/HybridView.kt b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/views/HybridView.kt index 0586f4cc7..bbc155207 100644 --- a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/views/HybridView.kt +++ b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/views/HybridView.kt @@ -20,19 +20,4 @@ abstract class HybridView: HybridObject() { @get:DoNotStrip @get:Keep abstract val view: View - - /** - * Holds the native C++ instance. - * In `HybridView`, the C++ instance is a sub-class of `JHybridView`, such as one of it's specs. - * This is `null`, until `updateNative(..)` is called. - */ - private var mHybridData: HybridData? = null - - /** - * Must be called in the constructor of a subclass of `HybridObject`, to initialize the C++ - * `JHybridObject` with a subclass of it. - */ - override fun updateNative(hybridData: HybridData) { - mHybridData = hybridData - } }