编译
编译32位版本:
env GOOS=android GOARCH=arm CC=/path/to/android/sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi30-clang GOARM=7 CGO_ENABLED=1 go build -v .
编译64位版本:
env GOOS=android GOARCH=arm64 CC=/path/to/android/sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android30-clang GOARM=7 CGO_ENABLED=1 go build -v .
不能用22版本的ndk,会导致编译失败
https://github.com/golang/go/issues/42725
编译后的二进制文件放到assets文件夹中
提取
将assets文件夹中的二进制文件,提取到app的私有file目录中,并授予执行权限
try { String path = getFilesDir().getAbsolutePath(); System.out.println(path); InputStream inputStream = getAssets().open(name); FileOutputStream fileOutputStream = new FileOutputStream(path + File.separator + name); byte[] buffer = new byte[1024]; int byteCount = 0; while ((byteCount = inputStream.read(buffer)) != -1) {// 循环从输入流读取 // buffer字节 fileOutputStream.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流 } fileOutputStream.flush();// 刷新缓冲区 inputStream.close(); fileOutputStream.close(); runCmd("/system/bin/chmod 744 " + path + File.separator + name); } catch (IOException e) { e.printStackTrace(); }
运行
添加环境变量并运行命令
String[] a = cmd.split(" "); String path = getFilesDir().getAbsolutePath(); ProcessBuilder processBuilder = new ProcessBuilder(a); final Map<String, String> environment = processBuilder.environment(); String pathEnv = environment.get("PATH"); if (pathEnv == null) { environment.put("PATH", path + File.separator); } else { pathEnv += (":" + path + File.separator); environment.put("PATH", pathEnv); } processBuilder.directory(new File(path + File.separator)); Process process = processBuilder.start(); InputStream reader = process.getInputStream(); int read; byte[] buffer = new byte[4096]; while ((read = reader.read(buffer)) > 0) { superHandler.obtainMessage(1, 0, read, buffer).sendToTarget(); } reader.close(); // Waits for the command to finish. process.waitFor(); return;