【转载】如何从源码编译OpenCV4Android库

Qt for Android 之 OpenCV编译(Windows下编译) 编译Opecv Android平台库, 并在 Qt for android项目中调用 阅读详情

原文摘自知乎网友稚晖的文章《如何从源码编译OpenCV4Android库》

目录

0.前言

1.使用现成Dock编译镜像

2.从头开始搭建编译环境

2.1 生成Docker基础容器

2.2 编译安装Cmake

2.3 安装与配置JDK环境

2.4 安装与配置Android SDK

2.5 下载OpenCV源码和contrib库

2.6 开始编译

3.编译选项分析


0.前言

OpenCV3.1时代开始,Android平台就已经有官方提供的OpenCV库了,理论上我们是不需要再自行编译的。而且OpenCV的官方建议也是直接使用OpenCV4Android库(也就是预编译的libopencv_java3.so),并提供了两套使用方法:

  • 利用OpenCV提供的全套Java接口, 在Android Java层调用。
  • 利用OpenCV提供的C/C++ 接口, 在JNI层使用(就跟在PC端VC++下使用OpenCV一样一样的)。

但是由于在实际的应用中难免会遇到一些问题,比如在Android工程中如果要同时使用SNPE(一个高性能神经网络加速库)和OpenCV时,由于SNPE使用的STL链接的是libc++,而OpenCV默认使用的是gnu_stl,所以会导致gradle不管怎么配置都无法正常编译过的情况。

这种情况下如果gradle中选择 arguments '-DANDROID_STL=c++_shared'的话SNPE可以正常编译,但是在使用像 imwrite这样的OpenCV函数时就会报链接错误。相反如果gradle中选择 arguments '-DANDROID_STL=gnu_stl'则SNPE无法编译通过。

另外一方面,官方预编译好的OpenCV4Android库是不带contrib模块的,所以无法使用像是`xfeatures2d`这样的类。

以上原因驱使我们需要能够自己从源码编译OpenCV4Android的库。编译方法有几种,可以在Linux下基于NDK编译,也可以在Windows中使用MinGW编译,本文选择的是前者,因为可以生成Docker镜像方便以后部署编译环境。

1.使用现成Dock编译镜像

这里使用的是我已经配置好的编译镜像,由于镜像文件尺寸很大(10GB左右),所以就不上传了,大家可以看完这一节的方法后根据下一节的教程自己生成一样的镜像。(这里就假设大家已经会使用Docker啦,话说Docker 这种神器早用早享受啊~)

Docker镜像环境配置如下:
镜像名称: opencv4android-builder.image
系统版本: Ubuntu 16.04
内部OpenCV版本: 3.4.8

启动Docker的命令如下:

docker run -it --name opencv4android-builder  --network host \
-v /home/pengzhihui/_share/OpenCV:/workspace/_share/OpenCV \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
opencv4android-builder.image

进入Docker容器之后首先设置一下环境变量:

export ANDROID_NDK=/workspace/opencv4android/tools/ndk/android-ndk-r17
export PATH=${PATH}:$ANDROID_NDK

export ANDROID_SDK=/workspace/opencv4android/tools/sdk/android-sdk-linux
export PATH=$ANDROID_SDK/tools:$PATH

export JAVA_HOME=/workspace/opencv4android/tools/jdk/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH

source  ~/.bashrc
如果需要修改NDK或者SDK等的版本则也需要更新这些环境变量。

然后进入目录/workspace/opencv4android/build,运行下面的脚本即可开始编译:

python ../opencv/platforms/android/build_sdk.py \
--extra_modules_path=/workspace/_net/opencv_contrib/modules/ \
--config ../opencv/platforms/android/ndk-17.config.py
如需要修改编译选项,则可以修改 opencv\platforms\android\android.toolchain.cmake文件。

2.从头开始搭建编译环境

这一节会介绍如何从头开始搭建上面的镜像环境,整个过程踩了很多坑,所以这里记录下来。

2.1 生成Docker基础容器

使用的基础镜像为Ubuntu16.04,因此如果本地没有这个镜像的话,需要先从网上pull一下:

sudo docker pull ubuntu:16.04

然后生成容器:

docker run -it --name opencv4android-builder-tmp  --network host \
-v /home/pengzhihui/_share/OpenCV:/workspace/_share/OpenCV \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
ubuntu:16.04

进入容器之后先建立在/worksapce/opencv4android工作目录(名字你自己定):

mkdir /worksapce/opencv4android && cd /worksapce/opencv4android

再根据需要建立如下结构的几个目录(有的目录是后面下载过程产生的):

接下来需要安装一些基础工具:

  • 先安装vim/nano编辑器用来更新源:
    apt update apt install vim

vim /etc/apt/sources.list
把源更新为阿里源并保存:

因为纯净的ubuntu Docker镜像是不带任何文本编辑器的,当然了如果你喜欢用cat命令那也可以直接操作。
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe


再次执行apt update即可。

  • 安装zip/unzip工具
    apt install zip unzip
  • 安装build工具链
    apt install build-essential
  • 安装Python2.7
    apt install python
  • 安装wget
    apt install wget
  • 安装git
    apt install git
  • 安装pip
    apt install python-pip
  • 安装ninja
    pip install ninja
  • 安装ant
    apt install ant
编译Java代码需要用到ant或者gradle,但是我因为是在服务器上进行编译,没有x11环境,也没装Android Studio,所以这里使用ant编译Java。

2.2 编译安装Cmake

如果直接使用apt安装cmake的话,得到的版本会过低(我这里是3.5),而编译OpenCV源码要求的Cmake最低版本是3.6,因此需要从源码编译安装一下。

另一方面,如果所用的cmake版本没有支持HTTPS,则编译OpenCV过程中会报 Download failed: 1;"unsupported protocol"错误,导致编译过程中的一些文件无法下载,因此务必安装下面的方法安装Cmake。

下载Cmake3.9.0的源码并编译:

wget --no-check-certificate https://cmake.org/files/v3.9/cmake-3.9.0.tar.gz
tar -zxvf cmake-3.9.0.tar.gz
cd cmake-3.9.0
apt-get install libcurl4-gnutls-dev
apt-get install zlib1g-dev
./bootstrap --system-curl
make && make install

大概需要10分钟时间。

完成后检测安装是否成功:

cmake --version

2.3 安装与配置JDK环境

在官网下载jdk安装包,这里选择的是:

这网站很坑非得要登陆才能下载

然后解压:

tar -zxvf  jdk-8u221-linux-x64.tar.gz

添加环境变量:

export JAVA_HOME=/workspace/opencv4android/tools/jdk/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export PATH=${JAVA_HOME}/bin:$PATH

source  ~/.bashrc
这里配置的环境变量会在重启后失效,需要在进入docker时重新配置,可以参考第一节中的脚本。(我也不想把环境变量写死以防后面需要更新各种SDK版本)。

运行下面的命令检查JDK是否配置成功:

java -version

2.4 安装与配置Android SDK

(个人:Android Studio里SDK Manager会自行管理SDK包的下载和安装,是否需要自行安装?)

在这里下载Android SDK的安装包,这里选择的是android-sdk_r24.4.1-linux.tgz。

将压缩包放置到tools/sdk文件夹并解压:

tar -zvxf android-sdk_r24.4.1-linux.tar

配置环境变量:

export ANDROID_SDK=/workspace/opencv4android/tools/sdk/android-sdk-linux
export PATH=$ANDROID_SDK/tools:$PATH

source  ~/.bashrc

运行下面的命令检查Android SDK是否配置成功:

android -h

运行下面的命令查看安装选项的序列号 :

android list sdk --all

按序列号安装需要的组件和sdk包:

这里安装以下内容:
  • 24- Android SDK Build-tools, revision 24.0.1
  • 54- SDK Platform Android 7.0, API 24, revision 2
android update sdk -u --all --filter  24,54

然后运行下面的命令安装Android SDK Platform-tools:

这条命令作用是安装所有包,但是这里不需要这么多包,等看到它安装完 Android SDK Platform-tools后就可以ctrl-c终止了。
android update sdk --no-ui

2.5 下载OpenCV源码和contrib库

运行下面的命令克隆opencv源码:

git clone https://github.com/opencv/opencv.git
cd opencv && git checkout 3.4

下载opencv的扩展库:

git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib && git checkout 3.4
注意一定要选择切换到合适的分支,否则编译肯定报错的。
这里目前Github仓库的3.4版本为3.4.8。

2.6 开始编译

跟第一节中的方法一样,切换到build目录执行下面的命令即可编译:

python ../opencv/platforms/android/build_sdk.py \
--extra_modules_path=/workspace/_net/opencv_contrib/modules/ \
--config ../opencv/platforms/android/ndk-17.config.py
由于cmake configure可能会失败,多试几次就好了。
所有的指令集都编译完成后,生成的库就在 OpenCV-Android-SDK目录下。

3.编译选项分析

编译的配置文件就是上面命令指明的ndk-17.config.py ,里面可以选择需要编译的指令集、STL库等等。

而调用ndk-17.config.py的是build_sdk.py脚本,在里面有ABI类的定义:

class ABI:
    def __init__(self, platform_id, name, toolchain, ndk_api_level = None, cmake_vars = dict()):
        self.platform_id = platform_id # platform code to add to apk version (for cmake)
        self.name = name # general name (official Android ABI identifier)
        self.toolchain = toolchain # toolchain identifier (for cmake)
        self.cmake_vars = dict(
            ANDROID_STL="gnustl_static",
            ANDROID_ABI=self.name,
            ANDROID_PLATFORM_ID=platform_id,
        )
        if toolchain is not None:
            self.cmake_vars['ANDROID_TOOLCHAIN_NAME'] = toolchain
        else:
            self.cmake_vars['ANDROID_TOOLCHAIN'] = 'clang'
            self.cmake_vars['ANDROID_STL'] = 'c++_static'
        if ndk_api_level:
            self.cmake_vars['ANDROID_NATIVE_API_LEVEL'] = ndk_api_level
        self.cmake_vars.update(cmake_vars)
        print ("---> "+self.cmake_vars['ANDROID_TOOLCHAIN'] +" " +self.cmake_vars['ANDROID_ABI']+" " +self.cmake_vars['ANDROID_STL'])
    def __str__(self):
        return "%s (%s)" % (self.name, self.toolchain)
    def haveIPP(self):
        return self.name == "x86" or self.name == "x86_64"

可以看到在ndk-17.config.py中传入的配置参数会在这里被解析更新,比如如果要使用clang编译带NEON支持的armeabi-v7a库并链接c++_shared的话,就改成下面的参数:

ABIs = [
    ABI("2", "armeabi-v7a", None, cmake_vars=dict(ANDROID_ABI='armeabi-v7a with NEON',ANDROID_STL="c++_shared"))
]

就完成啦,得到的OpenCV-Android-SDK库可以在Android Studio中愉快地使用了,不管是Java还是C++接口都很方便,美滋滋~

OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测 上一篇文章OpenCV4Android开发实录(1):移植OpenCV3.3.0库到Android Studio大概介绍了下OpenCV库的基本情况,阐述了将OpenCV库移植到Android Studio项目中的具体步骤。本文将在此文的基础上,通过对OpenCV框架中的人脸检测模块做相应介绍,然后实现人脸检测功能。 阅读详情

相关推荐

OpenCV源码交叉编译android库

OpenCV源码编译android库 之前的文章中介绍过如何源码编译OpenCV库,但是当时编译的是pc的cpu版本,但是在使用中,很多代码最终要运行在手机等便携式设备上,所以本文介绍一下,如何使用OpenCV源码检查编译构建android的opencv库。 交叉编译环境构建 首先需要下载android NDK,下载地址: https://developer.android.google.cn/n...

2Know的博客 3644

Windows环境下编译适用于NDK18及以上版本的opencv库

前言 因为NDK在更新18版本以后就取消了GUN的支持,gnustl也被移除(参考https://github.com/android-ndk/ndk/wiki/Changelog-r18),而opencv的安卓版本默认是使用gunstl编译的(大家可以去看源码文件夹下platforms\android里的android.toolchain.cmake),所以在更新了NDK后,直接编译原.........

qq_19313495的博客 2159

编译OpenCV for Android

前言:现在机器视觉越来越多的在移动设备上应用,所以,经常有人需要编译可以运行在android平台上的可以运行的OpenCV。 其实,编译OpenCV并不难,毕竟编译的脚本都写好了,运行一下就Ok了。不过,还是经常会遇见这样那样的问题。例如ffmpeg的版本不匹配就是一个最常见的问题。如果,在编译OpenCV的时候,有关于ffmpeg的报错,请留言,改日我单独写个博客说明,本篇博文主要解决编译Ope

minger1202的专栏 8230

win10编译OpenCV4Android系列1-Android编译环境搭建

win10编译OpenCV4Android系列1-Android编译环境搭建前言一、配置JDK1.下载JDK2.安装JDK二、配置AndroidSDKTools1.下载AndroidSDKTools2.安装AndroidSDKTools三、配置ANT1.下载ANT2.解压并配置环境变量四、下载NDK总结 前言 本文是系列文章1,最终目标是使用jni封装so,在Android上直接调用OpenCV的微信二维码解码接口。 安装环境如下: 1,jdk-8u321-windows-x64.exe 2,androi

yinqinggong的博客 847

使用opencv源码自己编制android so库的过程

工作需要,在android上使用opencv。opencv当前的版本(2.4.8)已经有了opencv4android,但是一方面这个SDK将所有opencv的功能打到了一个so包里,所以so的体积较大,从而造成使用该so的apk也大,上层对此不太满意;另一方面,使用opencv4android必须在手机上安装openv manager,上层对此也感觉有点别扭。所以我尝试用opencv的源码自己编

lantishua的专栏 1万+

施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态

本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。

weixin_33701617的博客 326

Android:如何从源码编译OpenCV4Android库

原文摘自知乎网友稚晖的文章《如何从源码编译OpenCV4Android库》我在这里根据自己的经验,增加一些备注。

katerdaisy的博客 2552

Selenium实战:突破反爬,自动化抓取国家知识产权局专利数据

网络爬虫是数据采集的核心技术,其原理是通过程序模拟浏览器行为,自动访问网页并提取结构化信息。在数据驱动决策的今天,高效获取公开数据对市场分析、技术调研和竞争情报至关重要。然而,面对广泛应用的JavaScript动态渲染和反爬虫机制,传统的静态页面抓取方法往往失效。Selenium作为浏览器自动化工具,通过驱动真实浏览器执行JavaScript,能够有效绕过前端反爬,实现“可见即可得”的数据抓取,在需要与页面进行复杂交互或处理动态内容的场景中价值显著。本文以【专利数据】抓取为例,结合【Selenium】工具,

weixin_33881140的博客 392

源码编译OpenCV android库,并编写一个native demo程序

不必配置环境变量,因为在编译时会指定NDK的路径,因为服务器的cmake版本是3.16.3基本上够用NDK路径。

qq_35227495的博客 1181

2024年最新双摄像头的实时视频拼接及目标跟踪(一)_监控视频拼接实时(1),网络相关+C C++三方库的源码分析+数据结构与算法

opencv中采用了SURF,ORB进行特征点提取,如果装的是opencv2.0版本,则可以直接用SURF,如果是3.0版本,则需要下载相应的contrib库进行安装。原理不赘述,给出其实验结果对比和分析,原始图像1SURF特征点提取网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加戳这里获取一个人可以走的很快,但一群人才能走的更远!

m0_51437227的博客 935

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 682

编译android平台使用的opencv

本文是在ubuntu上编译android native so库 首先去https://opencv.org/releases/下载opencv源码,这里用的是4.6.0版本。

Bleach3的博客 1097

Tauri开发环境配置避坑指南:从Rust到Node.js的全流程实战

本文是一份详尽的Tauri开发环境配置实战指南,重点解析了从Rust工具链安装、Node.js版本管理到IDE配置的全流程。文章深入探讨了包管理器选择、依赖锁定、网络镜像加速等关键环节,并提供了开发与构建过程中典型问题的排查思路与解决方案,旨在帮助开发者高效避坑,顺利搭建跨平台桌面应用开发环境。

w3x4y的博客 292

源码编译opencv的安卓Android库

因为项目需要,稍微改了opencv一点源码,这个时候就需要源码编译opencv的库了。我pc机器上面试了没有问题,但是我们项目是跑在移动设备安卓上面的,算法通过jni打包接口供上层java调用,opencv用的安卓版本的,这就坑爹了,没办法,我就编译安卓版本的opencv吧,这里面的坑真多。 参考链接: https://www.jianshu.com/p/925614d6e9e0 ...

无左无右的博客 2751

Altera FPGA与高速ADS4249和DAC3482的LVDS接口设计

引言:本文以TI的ADS4249(ADC)和DAC3482(DAC)之间的接口为例,介绍Altera FPGA与ADC/DAC之间的DDR LVDS接口设计以及时序约束详细设计。本文介绍的实例可方便扩展到具有类似接口格式的其他高速数据转换器设计。

FPGA_Designer 1899

YOLOv5改进有效涨点目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程60余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv8文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。本专栏持续更新网络上的所有前沿文章。

Snu77的博客 3万+

opencv源码交叉编译安卓库

因为项目需要编译opencv安卓动态库,应用于armv8-64平台,记录下编译过程。 一、交叉编译环境 系统:ubuntu16.04 ndk版本:android-toolchain-r14b(ndk下载地址,选对应版本)https://developer.android.google.cn/ndk/downloads/index.html cmake:3.6 camke命令安装,参考地址:https://www.cnblogs.com/wt645631686/p/6868487.html op..

manonggou的博客 1296

【批处理脚本】-0.1-如何运行批处理bat文件

如何运行批处理bat文件

「汽车电子助手」的博客 1584

Android:Linux上编译OpenCV的Android库,从源码编译出一个轻量级的OpenCV安卓库

(原文在这里,我根据这篇文章终于也能编译成功可以使用的OpenCV库文件了: Linux上编译OpenCV的Android库 https://zhuanlan.zhihu.com/p/301203711 整个编译过程只用下载Android NDK和OpenCV源码。工具链android.toolchain.cmake,是NDK:android-ndk-r19c-linux-x86_64自带的,不用自己编译了。使用WSL Ubuntu记得每行命令前都要加sudo权限,不然就会有很多莫名其妙的错误 )

katerdaisy的博客 2504

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

cmake导入so库_如何从源码编译OpenCV4Android库

这次的教程比较复杂,只是个人最近项目中刚好遇到的问题,把解决的过程记录下来顺便分享,大家看不懂没关系,可以先马一下以后开发APP项目中使用OpenCV遇到问题再来回顾~我后面有空也会尝试写一些OpenCV入门的教程,这个做计算机视觉必备的开源库还是有很多值得研究的地方的。0.前言OpenCV3.1时代开始,Android平台就已经有官方提供的OpenCV库了,理论上我们是不需要再自行编译的。而且O...

weixin_27153203的博客 402

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

(二)从OpenCV微信识别到安卓部署使用:配置及其编译

OpenCv配置及其安卓平台编译

motosheep的博客 1453

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib

本文是系列文章2,最终目标是使用jni封装so,在Android上直接调用OpenCV的微信二维码解码接口。

yinqinggong的博客 7352

在ubuntu系统上,将opencv源码编译到android上

有人会说了; 不是 有直接提供android 版本的sdk 包嘛? 干嘛要自己 编译呢? 主要是 因为,刚开始用的那个版本,(opencv 没加contrib 这个包含很多的算法包在里头) 那就自己编译咯 很多人 (博客) 都说了,这个其实不难编译. 那就开始吧 下载源码,opencv  opencv_contrib , Android Sdk NDK  等等;  下载其他的...

teleger的博客 673

编译android opencv,OpenCV3.4源码交叉编译android库

交叉编译环境系统:Ubuntu18.04ndk:android-ndk-14b(ndk下载地址,选对应版本)https://developer.android.google.cn/ndk/downloads/index.htmlcmake:3.10为了方便使用,先用NDK自带的脚本生成独立交叉编译工具链:cd /opt ###/opt为android-ndk-r14b所在的目录,根据...

weixin_31725659的博客 727

Linux 下交叉编译opencv4.5.5 android JNI基于 FFMPEG 的 VideoIO模块

Linux 下交叉编译android opencv4.5.5 for FFmepg库Prepare:编译ffmpeg编译opencv<1> 更改opencv-4.5.5目录下的CMakeLists.txt<2> 修改opencv-4.5.5/modules/videoio/cmake目录下的detect_ffmpeg.cmake<3>修改opencv-4.5.5/modules/java/CMakeLists.txt<4>设置环境变量执行编译更改OpenCVM

weixin_45893253的博客 6556
上一篇: 【转载】Android Studio工程目录解析
下一篇: RK3399上的Tengine实践笔记
LateLinux
博客等级 码龄18年 65粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值