React Native集成realm-js时Android端调用create方法出现SIGSEGV崩溃
问题根因
- 崩溃触发在JSC引擎的
setPrototypeWithCycleCheck方法,属于空指针类型的Native崩溃,触发原因是你向realm.create方法传入了自定义类Settings的实例,而非普通JSON对象。Realm的Android端JNI层需要修改传入对象的原型,对自定义类实例的处理存在兼容缺陷,最终触发崩溃。 - 该问题仅在Android端复现,是因为iOS和Android两端的JavaScriptCore引擎对原型修改的容错实现存在差异,iOS端可以兼容自定义类实例的传入,Android端则不行。
修复方案
直接将create方法的第二个参数替换为符合Schema定义的普通对象即可,不要传入new Settings()生成的自定义类实例:
const myRealm = new Realm({path: 'settings', schema: [Settings.schema], schemaVersion: 1}) myRealm.write(() => { // 传入的对象属性需和Settings.schema中定义的字段完全匹配 myRealm.create(Settings.schema.name, { // 示例:按你的Schema定义填入字段和对应值 // id: 0, // theme: 'light', // notificationEnabled: true }); })
如果你需要复用Settings类的默认属性,可以先将实例转为普通对象再传入:
const defaultSettings = Object.assign({}, new Settings()); myRealm.write(() => { myRealm.create(Settings.schema.name, defaultSettings); })
可选验证项
- 确认
Settings.schema.name的取值和Schema定义的表名完全匹配,无拼写错误 - 确认传入对象包含所有Schema中未标记为可选的必填字段,无缺失
- 如果你使用的Realm JS版本低于v10,建议升级到最新稳定版,该版本修复了大量Android端的原型处理兼容问题
内容的提问来源于stack exchange,提问作者SherlockFlips
相关产品推荐
相关产品推荐

