Skip to content

Instantly share code, notes, and snippets.

@nullbus
Created February 17, 2020 01:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nullbus/e10a16d80c3902e740cbedcb176cfeb7 to your computer and use it in GitHub Desktop.
Save nullbus/e10a16d80c3902e740cbedcb176cfeb7 to your computer and use it in GitHub Desktop.
// +build ignore
package main
import (
"bytes"
"flag"
"io"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
var (
ndkPath = flag.String("ndk", "r18b", "")
nowait = flag.Bool("nowait", false, "")
)
func main() {
flag.Parse()
// change to proper abi
patchArm64()
const symbolLookupDir = `Intermediate\Android\APK\obj\local\arm64-v8a\system\lib64`
if err := os.MkdirAll(symbolLookupDir, 0644); err != nil {
log.Fatalln(err)
}
soFiles, err := filepath.Glob(`Intermediate/Android/APK/gradle/app/build/intermediates/jniLibs/debug/arm64-v8a/*.so`)
if err != nil {
log.Fatalln(err)
}
for _, soPath := range soFiles {
if err = copyFile(filepath.Join(symbolLookupDir, filepath.Base(soPath)), soPath, false); err != nil {
log.Fatalln(err)
}
}
if *nowait {
executeAndLog(filepath.Join(`C:\NVPACK\android-ndk-`+*ndkPath, "ndk-gdb.cmd"), "-fvp", "Intermediate/Android/APK", "--launch", "--nowait")
} else {
executeAndLog(filepath.Join(`C:\NVPACK\android-ndk-`+*ndkPath, "ndk-gdb.cmd"), "-fvp", "Intermediate/Android/APK", "--launch")
}
}
func patchArm64() {
const appMkPath = `Intermediate/Android/APK/jni/Application.mk`
mkContent, err := ioutil.ReadFile(appMkPath)
if err != nil {
log.Fatalln("Application.mk not exists", err)
}
mkContent = bytes.ReplaceAll(mkContent, []byte(`armeabi-v7a`), []byte(`arm64-v8a`))
if err = ioutil.WriteFile(appMkPath, mkContent, 0644); err != nil {
log.Fatalln(err)
}
}
func copyFile(dest, src string, overwrite bool) error {
if !overwrite {
// check mod time
if destStat, err := os.Stat(dest); err == nil {
if srcStat, err := os.Stat(src); err == nil {
if srcStat.ModTime().Equal(destStat.ModTime()) || srcStat.ModTime().Before(destStat.ModTime()) {
return nil
}
}
}
}
srcfile, err := os.Open(src)
if err != nil {
return err
}
defer srcfile.Close()
destfile, err := os.Create(dest)
if err != nil {
return err
}
defer destfile.Close()
_, err = io.Copy(destfile, srcfile)
return err
}
func executeAndLog(executable string, args ...string) {
log.Println("execute", executable, strings.Join(args, " "))
cmd := exec.Command(executable, args...)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
log.Fatalln("execution failed:", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment