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提供了一个工具gobind
,gobind
可以生成对于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
二进制文件,.jni
,Java 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();