Golang 开发跨平台SDK(iOS, Android),Part 1

**前一篇**介绍了用React-Native做跨平台开发,其实Golang在1.5发布以后也是支持做移动端的跨平台开发的,Golang的移动端开发支持两种模式,一种是使用Golang开发整个应用,另外一种便是使用Golang开发common library。这两种各有优缺点,前者没有完善的UI库,如用来开发一个完整的应用需要的工作量着实有点不小,或者用来开发游戏可能也是一个不错的选择,亦或者寄望于Google可以开发出完善的UI库,至于后者想对于前者就方便多了,Google的GoMobile项目已经完善了大部分的工作,现在的缺点就是支持的数据类型还是远远不够,而且现只支持ARM架构。所以现阶段二者都还有些限制,但是作为一个跨平台的备选方案还是有其可取之处的。

How it works

在Google GoMobile的项目里Google提供了一个工具gobindgobind可以生成对于Java和Objective-C的bindings。下面是一段Golang代码

package mypkg

type Counter struct {
	Value int
}

func (c *Counter) Inc() { c.Value++ }

func New() *Counter { return &Counter{ 5 } }

生成的Java Bindings是

public abstract class Mypkg {
	private Mypkg() {}
	public static final class Counter {
		public void Inc();
		public long GetValue();
		public void SetValue(long value);
	}
	public static Counter New();
}

Objective-C 代码如下:

@class GoMypkgCounter;

@interface GoMypkgCounter : NSObject {
}

@property(strong, readonly) GoSeqRef *ref;
- (void)Inc;
- (int64_t)Value;
- (void)setValue:(int64_t)v;
@end

FOUNDATION_EXPORT GoMypkgCounter* GoMypkgNewCounter();

其实简单的来说就是将Golang翻译成Java和Objective-C,只不过bindings只是提供访问Golang编译后的二进制文件的接口。

How to build it

比如说你有个一个test.go文件

package mypkg
type Counter struct {
	Value int
}
func (c *Counter) Inc() { c.Value++ }
func New() *Counter { return &Counter{ 5 } }

1.在编译Android的library时可以使用
ANDROID_HOME=your_android_sdk_path gomobile bind -target=android -o file_path_for_android_library.aar -v test.go
这段代码会生成一个Java的二进制libray file_path_for_android_library.aar,其中包涵了ARM架构的.so二进制文件,.jniJava bindings classes等文件,在Android的项目中直接引用这个aar这个文件就可以用了。

Counter c = Mypkg.New();
c.Inc();
c.GetValue();

2.在编译iOS的library时可以使用
gomobile bind -target=iOS -o file_path_for_android_library.framework -v test.go
这段代码会生成一个iOS可用的framework库,然后在iOS的项目中引用这个file_path_for_android_library.framework就可以了。

GoMypkgCounter *c = [GoMypkgCounter init];
c.Inc();
c.Value();

更多信息可以看 https://godoc.org/golang.org/x/mobile/cmd/gobind