Skip to content

Instantly share code, notes, and snippets.

@scue
Created March 13, 2019 04:06
Show Gist options
  • Save scue/a4a09d9d288e0e62ae922dc86efa5494 to your computer and use it in GitHub Desktop.
Save scue/a4a09d9d288e0e62ae922dc86efa5494 to your computer and use it in GitHub Desktop.
修改GOMobile默认编译出来动态库名字(默认libgojni.so),新名字规则是lib<包名>.so

修改gomobile编译出来的动态库名字

  • 动态库命名规则:lib<包名>.so
  • 基于gomobile的ca3c58166ed802c9810ffc499b01bc1cd2e0153a commit进行修改
  • 修改文件:${GOPATH}/src/golang.org/x/mobile/cmd/gomobile/bind_androidapp.go
  • 修改完成后,执行go install -v golang.org/x/mobile/cmd/gomobile重新编译并安装gomobile二进制文件
diff --git a/cmd/gomobile/bind_androidapp.go b/cmd/gomobile/bind_androidapp.go
index 9897fbd..8ce17c3 100644
--- a/cmd/gomobile/bind_androidapp.go
+++ b/cmd/gomobile/bind_androidapp.go
@@ -6,6 +6,7 @@ package main
import (
"archive/zip"
+ "bytes"
"errors"
"fmt"
"go/build"
@@ -18,7 +19,12 @@ import (
"strings"
)
+const (
+ DefaultLibName = "gojni"
+)
+
func goAndroidBind(gobind string, pkgs []*build.Package, androidArchs []string) error {
+ targetPkg := pkgs[0].Name
if sdkDir := os.Getenv("ANDROID_HOME"); sdkDir == "" {
return fmt.Errorf("this command requires ANDROID_HOME environment variable (path to the Android SDK)")
}
@@ -68,7 +74,7 @@ func goAndroidBind(gobind string, pkgs []*build.Package, androidArchs []string)
"gobind",
env,
"-buildmode=c-shared",
- "-o="+filepath.Join(androidDir, "src/main/jniLibs/"+toolchain.abi+"/libgojni.so"),
+ "-o="+filepath.Join(androidDir, fmt.Sprintf("src/main/jniLibs/%s/lib%s.so", toolchain.abi, targetPkg)),
)
if err != nil {
return err
@@ -121,8 +127,9 @@ func buildSrcJar(src string) error {
// javac and jar commands are needed to build classes.jar.
func buildAAR(srcDir, androidDir string, pkgs []*build.Package, androidArchs []string) (err error) {
var out io.Writer = ioutil.Discard
+ targetPkg := pkgs[0].Name
if buildO == "" {
- buildO = pkgs[0].Name + ".aar"
+ buildO = targetPkg + ".aar"
}
if !strings.HasSuffix(buildO, ".aar") {
return fmt.Errorf("output file name %q does not end in '.aar'", buildO)
@@ -153,7 +160,7 @@ func buildAAR(srcDir, androidDir string, pkgs []*build.Package, androidArchs []s
}
const manifestFmt = `<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=%q>
<uses-sdk android:minSdkVersion="%d"/></manifest>`
- fmt.Fprintf(w, manifestFmt, "go."+pkgs[0].Name+".gojni", minAndroidAPI)
+ fmt.Fprintf(w, manifestFmt, "go."+targetPkg+"."+targetPkg, minAndroidAPI)
w, err = aarwcreate("proguard.txt")
if err != nil {
@@ -165,7 +172,7 @@ func buildAAR(srcDir, androidDir string, pkgs []*build.Package, androidArchs []s
if err != nil {
return err
}
- if err := buildJar(w, srcDir); err != nil {
+ if err := buildJar(w, srcDir, targetPkg); err != nil {
return err
}
@@ -214,7 +221,7 @@ func buildAAR(srcDir, androidDir string, pkgs []*build.Package, androidArchs []s
for _, arch := range androidArchs {
toolchain := ndk.Toolchain(arch)
- lib := toolchain.abi + "/libgojni.so"
+ lib := fmt.Sprintf("%s/lib%s.so", toolchain.abi, targetPkg)
w, err = aarwcreate("jni/" + lib)
if err != nil {
return err
@@ -250,7 +257,7 @@ const (
minAndroidAPI = 15
)
-func buildJar(w io.Writer, srcDir string) error {
+func buildJar(w io.Writer, srcDir, targetPkg string) error {
var srcFiles []string
if buildN {
srcFiles = []string{"*.java"}
@@ -262,6 +269,14 @@ func buildJar(w io.Writer, srcDir string) error {
if filepath.Ext(path) == ".java" {
srcFiles = append(srcFiles, filepath.Join(".", path[len(srcDir):]))
}
+ if strings.Contains(path, "LoadJNI.java") {
+ content, err := ioutil.ReadFile(path)
+ if err != nil {
+ return err
+ }
+ content = bytes.Replace(content, []byte(DefaultLibName), []byte(targetPkg), 1)
+ ioutil.WriteFile(path, content, 775)
+ }
return nil
})
if err != nil {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment