To take it off topic a little further. The idea at one point was write once and run everywhere with a consistent widget set, which doesn't work - it never worked with Java and it doesn't work with Xamarin, Titanium, Cordova, etc. The thinking now with modern cross platform systems is to use UI which is native to the system but abstract it in such a way that it makes it easy to manage. So with react-native you express your UI in JSX which is similar to ES6 with inline HTML and react-native translates that to the native UI of the platform. But you actually have separate entry points for android and ios and within react native you have different widgets for each platform. Where they can converge they do, so things like lists can be pretty standard cross platform, but android in particular has more advanced native UI, things like drawers, so you find yourself diverging a lot and building different components and views which are unique for each device but based on the same models. But most importantly you mark up the UI consistently between platforms, rather than having to port things between Cocoa Touch to XML/Java respectively - so you can copy and paste and tweak, or look for the lowest common denominator as your choice.
The same thing goes for Silver, which is a system to build cross platform applications in swift. You build the views for each platform separately but re-use the same logic.
The other factor is that each platform has different lifecycle events that you need to adhere to which most cross platform systems don't.
There's some trade-off, but for 90% of apps this approach works fine.