编译
编译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;