编译 sing-box 为动态库(.so 文件)需要以下步骤:
1.首先设置 Go 开发环境:
安装 Go (1.21 或更高版本)
安装 Android NDK
设置 ANDROID_NDK_HOME 环境变量
2.创建 Go 桥接代码:
singbox.go
package main
import "C"
import (
"encoding/json"
"log"
"sync"
"github.com/sagernet/sing-box/box"
"github.com/sagernet/sing-box/option"
)
var (
instance *box.Box
mutex sync.Mutex
)
//export StartVpn
func StartVpn(config *C.char) C.int {
mutex.Lock()
defer mutex.Unlock()
// 如果已有实例在运行,先停止它
if instance != nil {
instance.Close()
instance = nil
}
// 解析配置
configStr := C.GoString(config)
var options option.Options
err := json.Unmarshal([]byte(configStr), &options)
if err != nil {
log.Printf("Failed to parse config: %v", err)
return C.int(-1)
}
// 创建新实例
newInstance, err := box.New(&options)
if err != nil {
log.Printf("Failed to create instance: %v", err)
return C.int(-1)
}
// 启动服务
err = newInstance.Start()
if err != nil {
log.Printf("Failed to start service: %v", err)
return C.int(-1)
}
instance = newInstance
return C.int(0)
}
//export StopVpn
func StopVpn() C.int {
mutex.Lock()
defer mutex.Unlock()
if instance != nil {
instance.Close()
instance = nil
}
return C.int(0)
}
func main() {}
3.创建编译脚本:
build_android.sh
#!/bin/bash
export ANDROID_NDK_HOME="/path/to/your/android-ndk" # 替换为你的 NDK 路径
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"
# 支持的 Android 架构
ARCHS="arm64-v8a armeabi-v7a x86_64"
for ARCH in $ARCHS; do
case $ARCH in
"arm64-v8a")
GOARCH=arm64
;;
"armeabi-v7a")
GOARCH=arm
GOARM=7
;;
"x86_64")
GOARCH=amd64
;;
esac
echo "Building for $ARCH..."
export CGO_ENABLED=1
export GOOS=android
export GOARCH=$GOARCH
[ ! -z "$GOARM" ] && export GOARM=$GOARM || unset GOARM
export CC=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang
export CXX=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++
# 编译动态库
go build -buildmode=c-shared \
-o android/app/src/main/jniLibs/$ARCH/libsingbox.so \
lib/bridge/singbox.go
done
echo "Build completed!"
4.执行编译步骤:
1.首先安装依赖:
go get github.com/sagernet/sing-box
2.给脚本添加执行权限:
chmod +x scripts/build_android.sh
3.运行编译脚本:
./scripts/build_android.sh
5.检查编译结果:
编译完成后,会在 android/app/src/main/jniLibs/ 目录下生成以下文件结构:
jniLibs/
├── arm64-v8a/
│ └── libsingbox.so
├── armeabi-v7a/
│ └── libsingbox.so
└── x86_64/
└── libsingbox.so