编译 sing-box 为动态库(.so 文件)步骤

编译 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值