Skip to content

RuntimeException: Unrecognized type: class java.lang.Float for method: SomeViewManager#setProp #55350

@hannojg

Description

@hannojg

Description

I've noticed the following bug / crash.

imagine you have a codegen spec with a Float that you want to be optional:

type NativeProps = Readonly<{
  ...ViewProps,
  testFloatNullable?: CodegenTypes.Float,

actually codegen doesn't make this type in the native specs nullable, but instead will set a default value of 0f. To make it truly nullable we have to use WithDefault:

type NativeProps = Readonly<{
  ...ViewProps,
  testFloatNullable?: WithDefault<CodegenTypes.Float, null>,

In kotlin, this will generate the following ViewManagerInterface:

public interface RNTMyNativeViewManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
  void setTestFloatNullable(T view, @Nullable Float value);
}

This looks correct, nice!

Now to the problem: If in the ViewManager implementation I do @ReactProp(name = "testFloatNullable") an error is thrown making the app crash (see stacktrace).

When using @ReactProp it will be added by the FallbackViewManagerSetter we create here:

(It seems like this is always generated for a view manager as the PropsSetter thing is not rolled out yet to OSS?)

In there it tries to create a setter for the java.lang.Float type, but there is no mapping for it, so it crashes later down in that function:

Now, this really started to get me wondering about the @ReactProp annotation.
Because the code will work fine, even when removing the annotation! That's because codegen'ed view managers update the props through their delegates:

delegate.setProperty(viewToUpdate, entry.getKey(), entry.getValue());

Only when the delegate is not specified would we make use of the fallback:

protected ViewManagerDelegate<T> getDelegate() {
if (this instanceof ViewManagerWithGeneratedInterface) {
ReactSoftExceptionLogger.logSoftException(
TAG,
new ReactNoCrashSoftException(
"ViewManager using codegen must override getDelegate method (name: "
+ getName()
+ ")."));
}
return new ViewManagerPropertyUpdater.GenericViewManagerDelegate<>(this);

So, in my mind, if my view managers are all build for new arch and I properly use the delegate, I would not need to specify the @ReactProp.
Default values I would specify in my codegen spec using WithDefault.
If that's truly the case I feel like we should update the documentation on that?

Steps to reproduce

  1. In RNtester change the MyNativeViewNativeComponent like here: hannojg@10f13f9#diff-b5952b76e1edb5586bcd012664958340f987b8ec2c69c1b35d477b16a600c145
  2. On the native side implement the prop, add the @ReactProp annotation as shown here: hannojg@10f13f9#diff-edc21748fd95d8c2539af21c8d5bdb732bc7f1ed9d46e901604a32ec59862751

Compile & run the app, see the crash happening

React Native Version

0.83.1

Affected Platforms

Runtime - Android

Areas

Other (please specify)

Output of npx @react-native-community/cli info

info Fetching system and libraries information...
System:
  OS: macOS 15.7.3
  CPU: (14) arm64 Apple M4 Pro
  Memory: 161.67 MB / 48.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 22.14.0
    path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/node
  Yarn:
    version: 1.22.22
    path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/yarn
  npm:
    version: 10.9.2
    path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/npm
  Watchman:
    version: 2024.03.11.00
    path: /Users/hannogodecke/Documents/discord/.local/bin/watchman
Managers:
  CocoaPods:
    version: 1.16.2
    path: /Users/hannogodecke/.rbenv/shims/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 25.2
      - iOS 26.2
      - macOS 26.2
      - tvOS 26.2
      - visionOS 26.2
      - watchOS 26.2
  Android SDK:
    API Levels:
      - "31"
      - "34"
      - "35"
      - "36"
    Build Tools:
      - 34.0.0
      - 35.0.0
      - 35.0.1
      - 36.0.0
    System Images:
      - android-35 | Google APIs ARM 64 v8a
      - android-35 | Google Play ARM 64 v8a
      - android-35 | Pre-Release 16 KB Page Size Google Play ARM 64 v8a
      - android-35 | Pre-Release 16 KB Page Size Google APIs ARM 64 v8a
      - android-35 | Google APIs ATD ARM 64
      - android-36 | Google Play ARM 64 v8a
    Android NDK: Not Found
IDEs:
  Android Studio: 2025.2 AI-252.25557.131.2521.14432022
  Xcode:
    version: 26.2/17C52
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.15
    path: /Users/hannogodecke/.jenv/shims/javac
  Ruby:
    version: 3.4.4
    path: /Users/hannogodecke/.rbenv/shims/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 19.2.3
    wanted: 19.2.3
  react-native: Not Found
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found

Stacktrace or Logs

Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 7014 (mqt_v_js), pid 6950 (ook.react.uiapp)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'vivo/V2419_EEA/V2419:15/AP3A.240905.015.A2/compiler250531150613:user/release-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2026-01-29 16:25:33.449252220+0100
Process uptime: 5s
Cmdline: com.facebook.react.uiapp
pid: 6950, tid: 7014, name: mqt_v_js  >>> com.facebook.react.uiapp <<<
uid: 10281
tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'JNI DETECTED ERROR IN APPLICATION: JNI GetObjectRefType called with pending exception java.lang.RuntimeException: Unrecognized type: class java.lang.Float for method: com.facebook.react.uiapp.component.MyNativeViewManager#setTestFloatNullable
  at com.facebook.react.uimanager.ViewManagersPropertyCache$PropSetter com.facebook.react.uimanager.ViewManagersPropertyCache.createPropSetter(com.facebook.react.uimanager.annotations.ReactProp, java.lang.reflect.Method, java.lang.Class) (ViewManagersPropertyCache.java:464)
  at void com.facebook.react.uimanager.ViewManagersPropertyCache.extractPropSettersFromViewManagerClassDefinition(java.lang.Class, java.util.Map) (ViewManagersPropertyCache.java:533)
  at java.util.Map com.facebook.react.uimanager.ViewManagersPropertyCache.getNativePropSettersForViewManagerClass(java.lang.Class) (ViewManagersPropertyCache.java:392)
  at void com.facebook.react.uimanager.ViewManagerPropertyUpdater$FallbackViewManagerSetter.<init>(java.lang.Class) (ViewManagerPropertyUpdater.kt:151)
  at com.facebook.react.uimanager.ViewManagerPropertyUpdater$ViewManagerSetter com.facebook.react.uimanager.ViewManagerPropertyUpdater.findManagerSetter(java.lang.Class) (ViewManagerPropertyUpdater.kt:107)
  at java.util.Map com.facebook.react.uimanager.ViewManagerPropertyUpdater.getNativeProps(java.lang.Class, java.lang.Class) (ViewManagerPropertyUpdater.kt:93)
  at java.util.Map com.facebook.react.uimanager.ViewManager.getNativeProps() (ViewManager.java:414)
  at java.util.Map com.facebook.react.uimanager.UIManagerModuleConstantsHelper.internal_createConstantsForViewManager(com.facebook.react.uimanager.ViewManager, java.util.Map, java.util.Map, java.util.Map, java.util.Map) (UIManagerModuleConstantsHelper.kt:185)
  at com.facebook.react.bridge.NativeMap com.facebook.react.runtime.ReactInstance$Companion.getConstantsForViewManager(com.facebook.react.uimanager.ViewManager, java.util.Map) (ReactInstance.kt:626)
  at com.facebook.react.bridge.NativeMap com.facebook.react.runtime.ReactInstance$Companion.access$getConstantsForViewManager(com.facebook.react.runtime.ReactInstance$Companion, com.facebook.react.uimanager.ViewManager, java.util.Map) (ReactInstance.kt:586)
  at com.facebook.react.bridge.NativeMap com.facebook.react.runtime.ReactInstance._init_$lambda$1(com.facebook.react.runtime.ReactInstance, java.util.Map, java.lang.String) (ReactInstance.kt:230)
  at com.facebook.react.bridge.NativeMap com.facebook.react.runtime.ReactInstance.$r8$lambda$OWzGsGT35XIobeFyjEj9NOErJWs(com.facebook.react.runtime.ReactInstance, java.util.Map, java.lang.String) (ReactInstance.kt:-1)
  at com.facebook.react.bridge.NativeMap com.facebook.react.runtime.ReactInstance$$ExternalSyntheticLambda2.getConstantsForViewManager(java.lang.String) (D8$$SyntheticClass:0)
  at void com.facebook.jni.NativeRunnable.run() (NativeRunnable.java:-2)
  at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:1014)
  at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
  at void com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(android.os.Message) (MessageQueueThreadHandler.kt:21)
  at boolean android.os.Looper.loopOnce(android.os.Looper, long, int) (Looper.java:250)
  at void android.os.Looper.loop() (Looper.java:340)
  at void com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.startNewBackgroundThread$lambda$0(com.facebook.react.common.futures.SimpleSettableFuture) (MessageQueueThreadImpl.kt:152)
  at void com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion.$r8$lambda$YYXYCFexeoKtAeDpeNYkxZZlpbA(com.facebook.react.common.futures.SimpleSettableFuture) (MessageQueueThreadImpl.kt:-1)
  at void com.facebook.react.bridge.queue.MessageQueueThreadImpl$Companion$$ExternalSyntheticLambda0.run() (D8$$SyntheticClass:0)
  at void java.lang.Thread.run() (Thread.java:1012)

    in call to GetObjectRefType
    from void com.facebook.jni.NativeRunnable.run()'

MANDATORY Reproducer

https://github.com/hannojg/react-native/blob/codegen/repro-android/packages/rn-tester/js/examples/Playground/RNTesterPlayground.js

Screenshots and Videos

No response

Metadata

Metadata

Assignees

No one assigned

    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