ui/app: call main from Android and iOS

Android can only run c-shared libraries which means that every
Gio program must create its window and event loop from an init
function.

The same applies to iOS but for a more benign reason: the gio tool
builds programs in c-archive mode for iOS and links the binary with
a Objective-C driver.

Allow Gio programs to run off its main function by linking to and
invoking main even from Android libraries and iOS ditto.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-07-22 11:17:09 +02:00
parent 4e0d820a5b
commit c080a54038
13 changed files with 87 additions and 41 deletions
+22
View File
@@ -0,0 +1,22 @@
// +build android darwin,ios
package app
// Android only supports non-Java programs as c-shared libraries.
// Unfortunately, Go does not run a program's main function in
// library mode. To make Gio programs simpler and uniform, we'll
// link to the main function here and call it from Java.
import _ "unsafe" // for go:linkname
//go:linkname mainMain main.main
func mainMain()
func runMain() {
go func() {
// Indirect call, since the linker does not know the address of main when
// laying down this package.
fn := mainMain
fn()
}()
}