I have been experimenting over the last few years looking for the definite answer to cross platform mobile development. These are some of my thoughts after evaluating some approaches.
Hybrid – Cordova/PhoneGap
Java (using J2Obc)
This approach has all the non-UI code written in Java. The Java code can be used on Android and on the web using GWT. On iOS the java-2-objective c process translates the Java code to Objective C which can then be imported into the Swift/Objective C project on iOS and Mac. This is the approach used by Google. Google is heavily backing the j2objc project if commits to the GitHub project is any indicator.
Microsoft implementation (through acquisition) of the Android and iOS API in C#. The native code is all written in C# instead of Objective C/Swift on iOS and Java for Android. The non-UI code is shared across Android and iOS. The native API’s are exposed in C#. It seems like a good choice especially for Microsoft shops. It was one of my top picks when we evaluated it at work. In the end it does not seem to much different than the C++ or Java. The native code is written in C# which I feel is a little non-standard but it could work. I am going to investigate this in more detail.