React Native向原生模块传Uint8Array报错求助
解决React Native传递Uint8Array到Java原生模块的"Malformed calls from JS"错误
错误原因
该错误是JS与Java原生层参数序列化/反序列化不匹配导致的,通常是参数类型不兼容、参数数量不一致,或是缓存引发的映射异常。
解决步骤
检查Java方法签名
确保Java层方法接收的是byte[]类型,这是React Native默认映射Uint8Array的类型,不要使用ByteBuffer或其他非匹配类型:@ReactMethod public void handleByteArray(byte[] data) { // 你的处理逻辑 }验证JS侧传递的数组
确保传递的是标准Uint8Array,避免传递被修改过的嵌套数组或非完整TypedArray:const validUint8 = new Uint8Array([0x01, 0x02, 0x03]); YourNativeModule.handleByteArray(validUint8);核对参数数量一致性
确认JS调用时的参数个数与Java方法的参数个数完全一致,不要多传或漏传参数。清理缓存并重新构建
缓存异常可能导致类型映射错误,执行以下命令重置并重新编译:npx react-native start --reset-cache cd android && ./gradlew clean && ./gradlew assembleDebug大数组备选方案:Base64中转
如果传递的数组过大,可先转成Base64字符串传递,Java层再解码:
JS侧:const base64Str = btoa(String.fromCharCode(...validUint8)); YourNativeModule.handleBase64(base64Str);Java侧:
import android.util.Base64; @ReactMethod public void handleBase64(String base64) { byte[] data = Base64.decode(base64, Base64.DEFAULT); // 处理逻辑 }
内容的提问来源于stack exchange,提问作者Nikita Plotnikov
相关产品推荐
相关产品推荐

