GOMOBILE写Android和iOS移动端SDK

https://blog.csdn.net/win_lin/article/details/60956485

GOMOBILE

设置GO环境以及GOPATH,参考GO环境设置

GOMOBILE资料参考官方WIKI,这个WIKI貌似对SDK和NDK没有说清楚。

Android SDK+NDK

下载和安装AndroidSDK和AndroidNDK,MacOS安装到:

  1. # AndroidSDK
  2. /Users/winlin/Library/Android/sdk
  3. # AndroidNDK
  4. /Users/winlin/Library/Android/sdk/ndk-bundle

也就是看到下面的文件就算成功:

  1. Mac:sdk winlin$ ls /Users/winlin/Library/Android/sdk
  2. build-tools extras ndk-bundle platform-tools
  3. skins system-images cmake licenses
  4. patcher platforms sources tools
  5. Mac:sdk winlin$ ls /Users/winlin/Library/Android/sdk/ndk-bundle
  6. CHANGELOG.md ndk-gdb prebuilt
  7. sources android-ndk-r13b ndk-stack
  8. python-packages toolchains build
  9. ndk-which shader-tools ndk-build
  10. package.xml simpleperf ndk-depends
  11. platforms source.properties

一般AndroidStudio的local.properties文件,这个是自动生成的,会默认这指定SDK和NDK的地址:

  1. Mac:hello-jni winlin$ cat android-ndk/hello-jni/local.properties
  2. ## This file is automatically generated by Android Studio.
  3. # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
  4. ndk.dir=/Users/winlin/Library/Android/sdk/ndk-bundle
  5. sdk.dir=/Users/winlin/Library/Android/sdk

参考项目android-ndk/hello-jni

GOMOBILE TOOLS

直接下载和安装gomobile:

  1. go get golang.org/x/mobile/cmd/gomobile

备注:如果被墙了,可以自己把gomobile项目clone到$GOPATH/src/golang.org/x下面,GITHUB地址。

先设置下SDK的环境变量给gomobile用,当然如果NDK在其他地方需要指定NDK路径。然后初始化gomobile:

  1. export ANDROID_HOME=/Users/winlin/Library/Android/sdk
  2. $GOPATH/bin/gomobile init

注意:如果NDK没有安装对,gomobile init不会出错,但是后面gomobile bind会出错。

GO Code

GOLANG的CODE非常简单,参考gomobile/examples/bind/hello:

  1. // Copyright 2015 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // Package hello is a trivial package for gomobile bind example.
  5. package hello
  6. import "fmt"
  7. func Greetings(name string) string {
  8. return fmt.Sprintf("Hello, %s!", name)
  9. }

备注:需要按照GOLANG的package的规则,放在$GOPATH/src下面,否则编译会报错。

Build Mobile SDK

然后编译AndroidNDK用的库:

  1. $GOPATH/bin/gomobile bind -target=android

生成了Android可以引用的.aar,直接搞定:

  1. Mac:temp winlin$ ls -lh
  2. total 5712
  3. -rw-r--r-- 1 winlin staff 2.8M Mar 9 10:31 hello.aar
  4. -rw-r--r-- 1 winlin staff 333B Mar 9 10:28 hello.go

还可以生成iOS用的库:

  1. $GOPATH/bin/gomobile bind -target=ios

可以看到iOS的库:

  1. Mac:temp winlin$ ls -lh Hello.framework/
  2. total 32
  3. lrwxr-xr-x 1 winlin staff 24B Mar 9 10:32 Headers -> Versions/Current/Headers
  4. lrwxr-xr-x 1 winlin staff 22B Mar 9 10:32 Hello -> Versions/Current/Hello
  5. lrwxr-xr-x 1 winlin staff 24B Mar 9 10:32 Modules -> Versions/Current/Modules
  6. lrwxr-xr-x 1 winlin staff 26B Mar 9 10:32 Resources -> Versions/Current/Resources
  7. drwxr-xr-x 4 winlin staff 136B Mar 9 10:32 Versions

库的大小:

  1. Mac:temp winlin$ du -sh *
  2. 5.1M Hello.framework
  3. 2.8M hello.aar
  4. 4.0K hello.go

Android APP

新建一个Android APP,目录在/Users/winlin/git/MyApplication。

将hello.aar链接或拷贝到app/libs下面:

  1. cd ~/git/MyApplication/app/libs
  2. ln -sf $GOPATH/src/temp/hello.aar

然后修改app/build.gradle(在Android Studio中也可以改,打开Gradle Scripts => build.gradle(Module: app)这个文件就是),添加下面内容:

  1. repositories {
  2. flatDir {
  3. dirs 'libs'
  4. }
  5. }
  6. dependencies {
  7. compile(name: 'hello', ext: 'aar')
  8. }

注意:dependencies一般都有这个了,只需要把compile加进去就可以。

注意:compile的name不能瞎写,和那个hello.aar 文件名一致。

然后在项目中就可以看到内容了:

在MainActivity中可以直接引用:

  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. TextView txt = new TextView(this);
  7. txt.setText(Hello.greetings("SRS"));
  8. setContentView(txt);
  9. }
  10. }

运行结果:

GOMOBILE for Android

iOS APP

新建一个iOS的Application,选Swift语言:

Create Project

在Main.storyboard中,添加一个UILabel控件:

Add UILabel

在ViewController.swift中引用UILabel控件为成员。在Main.storyboard中选中label后,右键,拖New Referencing Outlet到ViewController.swift中:

Map

输入这个引用,也就是成员变量的名字:

Map

可以看到创建了一个引用:

在viewDidLoad中修改Label的值:

  1. class ViewController: UIViewController {
  2. @IBOutlet weak var txtMain: UILabel!
  3. override func viewDidLoad() {
  4. super.viewDidLoad()
  5. txtMain.text = "Hello, iOS"
  6. }

运行就可以看到Label的值改变了。下面引入Hello.framework,先拷贝到项目下面:

  1. cd ~/git/HelloWorld
  2. ln -sf $GOPATH/src/temp/Hello.framework

文件如下:

  1. Mac:HelloWorld winlin$ ls -lh
  2. total 0
  3. drwxr-xr-x 7 winlin staff 238B Mar 9 13:56 Hello.framework
  4. drwxr-xr-x 7 winlin staff 238B Mar 9 13:48 HelloWorld
  5. drwxr-xr-x 5 winlin staff 170B Mar 9 13:56 HelloWorld.xcodeproj
  6. drwxr-xr-x 4 winlin staff 136B Mar 9 13:21 HelloWorldTests
  7. drwxr-xr-x 4 winlin staff 136B Mar 9 13:21 HelloWorldUITests
  8. Mac:HelloWorld winlin$ ls -lh Hello.framework/
  9. total 32
  10. lrwxr-xr-x 1 winlin staff 24B Mar 9 13:56 Headers -> Versions/Current/Headers
  11. lrwxr-xr-x 1 winlin staff 22B Mar 9 13:56 Hello -> Versions/Current/Hello
  12. lrwxr-xr-x 1 winlin staff 24B Mar 9 13:56 Modules -> Versions/Current/Modules
  13. lrwxr-xr-x 1 winlin staff 26B Mar 9 13:56 Resources -> Versions/Current/Resources
  14. drwxr-xr-x 4 winlin staff 136B Mar 9 13:56 Versions

在xcode中,添加framework:

Add Framework

在代码中引入framework:

代码改成这样:

  1. import UIKit
  2. import Hello
  3. class ViewController: UIViewController {
  4. @IBOutlet weak var txtMain: UILabel!
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. txtMain.text = HelloGreetings("SRS")
  8. }

调用的是SDK中的函数。运行结果:

Conclusion

总结下:

  • 直接用AndroidNDK编写SDK,需要自己写JNI。而gomobile一个命令,把脏活累活都给弄好了。便利性gomobile占优。
  • 可以一份代码支持Android和iOS,维护上比较方便。
  • 体积上,gomobile的so最起码有2.8MB,比C要大很多。
  • 成熟度上,gomobile目前还没release,虽然2015就已经在GO大会上出现了。

作者:win_lin
来源:CSDN
原文:https://blog.csdn.net/win_lin/article/details/60956485

版权声明:本文为博主原创文章,转载请附上博文链接!

ft_authoradmin  ft_create_time2019-03-30 17:49
 ft_update_time2019-03-30 18:03