**前一篇**介绍了用React-Native做跨平台开发,其实Golang在1.5发布以后也是支持做移动端的跨平台开发的,Golang的移动端开发支持两种模式,一种是使用Golang开发整个应用,另外一种便是使用Golang开发common library。这两种各有优缺点,前者没有完善的UI库,如用来开发一个完整的应用需要的工作量着实有点不小,或者用来开发游戏可能也是一个不错的选择,亦或者寄望于Google可以开发出完善的UI库,至于后者想对于前者就方便多了,Google的GoMobile项目已经完善了大部分的工作,现在的缺点就是支持的数据类型还是远远不够,而且现只支持ARM架构。所以现阶段二者都还有些限制,但是作为一个跨平台的备选方案还是有其可取之处的。
How it works
gobindgobind
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 } }
ANDROID_HOME=your_android_sdk_path gomobile bind -target=android -o file_path_for_android_library.aar -v test.gofile_path_for_android_library.aar.so.jniJava bindings classesaar
Counter c = Mypkg.New();
c.Inc();
c.GetValue();
gomobile bind -target=iOS -o file_path_for_android_library.framework -v test.gofile_path_for_android_library.framework
GoMypkgCounter *c = [GoMypkgCounter init];
c.Inc();
c.Value();