Golang开发动态库的实现

2020-01-28 14:14:24王旭

具体的配置可自行去查找,这里不是主要讲JNI的,所以就不讲这么细。

还需要一个Application.mk


# 选择不同的 ABI,多个使用空格作为分隔符,全部是all
# APP_ABI := armeabi armeabi-v7a
APP_ABI := armeabi-v7a

# 指定要使用的运行时
APP_STL := c++_static

当然这样还不行,都说了是Gradle进行编译,那么肯定还要在Gradle中写一些配置


android {
   defaultConfig {
        ndkBuild {
        //指定 Application.mk 的路径
        arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk"
        //指定生成哪些平台的 so 文件
        abiFilters "armeabi-v7a"
        //cFlags 和 cppFlags 是用来设置环境变量的, 一般不需要动
        cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2"
        cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2"
      }
   }

  sourceSets { main { jni.srcDirs = ['src/main/jni'] } }

  externalNativeBuild {
    ndkBuild {
      path file('src/main/jni/Android.mk')
    }
  }

}

这样就能简单的跑一个JNI的Demo,总的来说就是Java这边写一个类定义一些native方法和加载,C++这边写具体的方法实现。

二.用Go开发动态库

上面说的原生方法是用C/C++进行开发的,那么如果你不会C++的话怎么办,C++的学习也并非这么容易,就拿两边的类型来说,一开始新手肯定会碰到类型转换的问题,往往会先劝退一些人,但是Go不一样,有Java基础的话学起go还是挺快的。

那么用Go开发的动态库是怎样的?也是SO文件吗,是不是也像C++一样,编译后经过某步操作生成SO文件。

我看到网上有些文章确实是写怎么生成so的,但是说得太少,感觉不可靠,直到我看到官方有写。

可以在官方中看到是有一个mobile的库的

https://github.com/golang/mobile

读下去它会指引你去wiki

https://github.com/golang/go/wiki/Mobile

可以看出它会打出一个aar的文件,那么aar对于我们接入来说确实很方法,但我很想探究这个aar里面究竟是什么,所以我们需要打出一个aar然后解压看看它里面到底是什么

这里先说一下,下载这个库之前,你本地肯定先要配置好Go的环境

然后按照这里的流程就行下载


go get -d golang.org/x/mobile/example/basic

但这输入这条命令需要科学上网的方式才能下载,总的来说很麻烦。

所以我们可以直接克隆mobile的库,就是上面的这个链接 https://github.com/golang/mobile

直接下载下来,除此之外,还需要tools,这些都在Go中,链接 https://github.com/golang/tools