I actually think that you underestimate how good j2obj2 + gwt combination is. :)
We have a thin platform specific layer:
— 13k lines in Java for Android
— 12k lines in Java and Objective-C for iOS
— 12k lines in Java and JavaScript for Web
This layer integrates all platform specific external SDKs we use (starting with Google Analytics and Mixpanel and up to Google/Apple/Facebook login and Twilio video conferencing) and includes a translation layer (including right-to-left support), color, font and image abstraction layer and wrappers for GUI components we use.
And the wrappers ensure that components work the exact same way in all platforms, like, for example, they support iOS-style block animations in Android, iOS and Web identically:
XVL.screen.animate(() -> {
button.setAlpha(0.5f).setFrame(100f, 0f, 200f, 100f);
label.setFont(Fonts.BLACK_REGULAR).setBackground(Colors.ITEM_SELECTED);
});
Android, iOS and Web projects are configured to compile the folders that are relevant to each, thus cross-platform code instantiates com.jvesoft.xvl.Label and gets the platform-correct instance.
The code of the client application itself currently has 418k lines of pure cross-platform Java (including the presentation layer!), which means that over 92% of our code is platform-independent, thanks to you (!!!) and other authors of j2objc and gwt. :)
Yes, it's been a while since I thanked you for your amazing work!
P.S.: Yes, I had to patch j2objc code to make all anonymous classes have weak reference to their outer classes without a need for an annotation — I have failed to convince you that this is a better way, yet it works so good — literally no memory issues since. :)