JNI(java Native Interface)linux下 java调用本地c函数

Linux下测试Java的JNI(Java Native Interface) 我是在32位Ubuntu12.04下做这个测试的, 以下假定已经配置好了JAVA_HOME,CLASSPATH这两个环境变量(绿色的“注”可以不看) 1. 编写NativeTest.java, 代码如下: public class NativeTest { /* 声明一个本地(native)函数 */ public native static double max(do 阅读详情
1.准备工作:Ubuntu安装jdk,jre

安装:

sudo apt-get install openjdk-9-jdk openjdk-9-jre

配置环境变量:

vim ~/.zshrc 添加

export JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

java调用本地c语言的库文件时,需要环境变量LD_LIBRARY_PATH.

添加环境变量:

sudo vim /etc/profile 添加

LD_LIBRARY_PATH=/home/lhg/test/jni_test/
export LD_LIBRARY_PATH

注意将/home/lhg/test/jni_test替换成自己的工程目录

2.一个JNI的例子

一个java程序例子:

HelloWorld.java

public class HelloWorld
{
    public native void displayHelloWorld();     //使用native关键字修饰要调用的c函数
    static
    {
        System.loadLibrary( "hello" );      //载入libhello.so链接库
    }
    public static void main( String[] args )
    {
        new HelloWorld().displayHelloWorld();   //调用库函数
    }
}

1.要调用的c函数在java文件内只需要声明,声明时要使用native关键字修饰。

2.使用System.loadLibrary()载入c的动态共享库,上面例子中载入的动态共享库的名字为libhello.so

接下来执行如下命令,javac编译java文件,javah根据编译出来的class文件生成对应的.h文件

javac HelloWorld.java

javah HelloWorld

javah命令产生的HelloWorld.h文件内容如下:

HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
//#include <jni.h>          //生成的HelloWorld.h文件是这样的,我用下面一句替换
#include "/usr/lib/jvm/java-9-openjdk-amd64/include/jni.h"
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

上面我将程序生成的文件中include

#include "/usr/lib/jvm/java-9-openjdk-amd64/include/jni.h"  //解决编译时找不到jni.h
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld( JNIEnv * j, jobject obj )
{
    printf( "hello world!\n" );
    return ;
}

然后使用命令生成动态库即可。

linux下生成动态共享库:

gcc -fPIC -shared -o libhello.so HelloWorld.c

输入下面命令执行即可:

java HelloWorld

后期出现的问题:

1..java文件中如果使用package语句加入包名之后,编译命令有所区别:

javac -d . HelloWorld.java
javah com.jni.HelloWorld    //这里假如你的包名为com.jni
jave-nativebin-win64-2.6.1.jar jave服务jar包,适用系统windows64位,无需安装,直接引入工程 立即下载

相关推荐

jave-nativebin-win64-3.0.0.jar

压缩视频

Java -- 视频压缩(返回压缩后的base64字符串)

前言: 压缩时间较长, 10M压缩至1M大概需要2~3秒, 不怎么失帧; Demo中返回base64字符串, 可根据自己需求改返回值类型; 环境: JDK 1.8 IDEA 2021.3 具体请看代码: 注意: Window环境和Linux环境需要引用不同的包,建议都引用; 如果是32位,请把64改为32; <dependency> <groupId>ws.schild</groupId> ..

记录者的博客 3841

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 303

Java——JAVE(音视频格式转换)

JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库,它是基于FFmpeg。JAVE库提供了一些简单易用的API,用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。这些库都是基于FFmpeg的,并允许在Java中处理音频和视频文件。使用它们可以避免直接调用外部的FFmpeg命令行工具,而是通过Java API来实现音频格式转换等操作。

吴声子夜歌的博客 2万+

Maxwell中铜导体热损计算的关键步骤与技巧

本文详细介绍了在Maxwell软件中准确计算铜导体热损的关键步骤与实用技巧。重点阐述了如何正确设置涡流场求解器、启用涡流效应、根据工作频率计算并应用肌肤深度以指导网格剖分,以及准确施加激励和定义电流回路。文章还强调了使用温度相关材料属性和进行后处理验证的重要性,旨在帮助工程师获得可靠的热损计算结果,优化产品设计。

weixin_29232121的博客 498

保姆级教程:用Python+OpenCV实现相移法与格雷码三维重建(从生成条纹到点云生成)

本文详细介绍了使用Python和OpenCV实现相移法与格雷码三维重建的全流程,从条纹生成到点云计算。通过结构光技术,结合相移法和格雷码,实现高精度的三维重建,适用于无纹理物体表面的密集对应点生成。教程包含环境搭建、条纹生成、相位计算、三维点云重建及常见问题排查,适合计算机视觉开发者和研究人员。

weixin_33443333的博客 351

JAVA实现对视频的压缩

JAVA实现对视频的压缩

Peng2391670454的博客 2199

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5946

Linux环境java使用jni调用本地方法

干活前先把流程理清楚,先把工作场景,分析步骤 1.创建一个本地方法的java定义 2.将java定义转化成c定义 3.实现c定义 4.将实现的c定义转化成链接库 5.加载链接库,调用本地方法触发链接库的实现 先查看本地方法的类,步骤1 /** * 调用本地方法的组件 */ public class NativeUtils { /*比大小*/ public native int max(int i, int y); } 编译生成字节码文件:javacNativeUt.

shanghaichongmin的博客 1130

【目标检测-YOLO】YOLOv5-v5.0-yolov5s网络架构详解(第一篇)

源码:GitHub - ultralytics/yolov5 at v5.0 由于YOLO v5 代码库在持续更新,如上图,有多个版本,每个版本的网络结构不尽相同。以下内容以 v5.0 为准,网络结构选用 yolov5s。 为了方便画图和理解网络结构,选用可视化工具:Netron 网页版进行可视化, 然后使用PPT作图。 在Releases · ultralytics/yolov5 · GitHub找到 v5.0中的Assets 中的yolov5s.pt并下载该权重。 下图为直接......

博观约取,厚积薄发 2万+

Mac电脑安装burp suite2024版本记录

下载最新版本burpsuitloader-XXX-all.jar,改名为burpsuitloader.jar。目录下,修改vmoptions.txt文件,新增以下内容,如果keygen不是这个名称的话,需要修改。,点击license左侧的copy复制它,然后手动从启动台启动burpsuite。,复制如下命令到终端即可(要加双引号,不然目录中空格会导致命令截断)再复制激活响应信息到burpsuite中即可激活。后续运行burp直接从启动台运行即可。将如下框的信息复制到激活器中。输入后下一步,点击手动激活。

墨痕诉清风的博客 908

Java工程使用ffmpeg进行音视频格式转换(ws.schild)

ws.schild是基于ffmpeg的java工具包,是目前主流的对视频和音频进行转码、裁剪以及提取操作的java工具包

和光同尘的博客 1万+

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE

当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 642

linux jni调用so

本文转载自百度博客http://hi.baidu.com/fengying765/blog/item/7081113e5fde53e555e7233f.html感谢原作者提供如此详细的解决方案作为主调方的Java源程序TestJNI.java如下。代码清单15-4 在Linux平台上调用C函数的例程——TestJNI.java1.       public class TestJNI2.       {3.          static4.          {5.            System.l

4676

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1484

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

初学JNI-NDK编程

我们在做Android开发时,有时因为实际需要,需要调用本地的c或c++库,这个时候就会用到JNI,JNI是Java Native Interface的简称,可以理解为:java本地调用。NDK全称:Native Development Kit,NDK是一系列工具的集合。         使用JNI是有代价的,java程序可以做到与平台无关。但如果java程序通过JNI调用了原生的代码(比如c/

jarryguang的专栏 839

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java中使用JNI调用本地动态库的方法(图文详解加代码示例)

在Java中,要使用动态库,就要使用到 JNI。首先来看看百度百科对JNI的描述:从Java1.1开始,Java Native Interface(JNI)标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。 使用java与本地已编译的代码交互,通常会丧失平

招财猫_Martin 的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Jni:架起 Java 和 C/C++的桥梁,Java Native Interface

前言正如标题所说,Jni(Java Native Interface) 把 Java 和 C/C++之间联系起来了。这样的话,Java可以直接调用C/C++语言编写的代码。

caitao_zhan 2183

JNI之JAVA调用C程序(linux环境)

JNI之JAVA调用C程序(linux环境) 因业务需求,需要对上传的文件做crc文件冗余校验,由于规则比较特殊一般JAVA的CRC校验无法得到正确的crc值,因此考虑使用JAVA调用C的方法实现。 JNI介绍 JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分...

jl935418600的博客 1030

Linux下java使用JNI调用C++

Linux下java使用JNI调用C++ 1.JNI介绍 JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码 2.准备JNI 先用javah,根据.java文件生成.h头文件,然后用C++实现这个接口 2.1先在目录下创建JNI.java文件 内容如下 //JNI.java文件 pu...

tsh123321的博客 2841

Linux上通过JNI编译C语言so库供Java调用示例

,以下对Linux下编译JNI的so库和Java调用so库的过程和踩到的一些坑记录一下。

loutengyuan的专栏 1202

Linux下,JNI的应用例程解析(一)——Java调用C库

说明:本文借助一个简单的Holle World例程,在Linux平台上演示如何使用JNI,实现Java调用C的库。 JIN说明 JNI是Java native interface的简写,可以译作Java原生接口。 Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个福音。 JNI是Java与C/C++交互的接口。 使用JNI也是有代价。...

ja_guar_的博客 545

java通过JNI调用C

软件环境是在Linux上跑,在此记录下 1、第一步:创建一个java类 里面包含了一个main方法,和一个native的start0()方法。 1.1 静态代码块中加载了一个本地库 System.loadLibrary("MyThreadNative"); 这个库文件是后面通过c文件生成的 1.2 main方法里new 了一个对象,调用该对象的本地方法start0() MyThre...

you1272586223的博客 1282

Java 通过 JNI 调用 C 之一 HelloWorld 入门

凤姐:杰,我是你的什么 杰伦:凤,你是我的 JNI 捧在手心,暖暖的,连接你我他,连接java和c++

棺材深處 1678

从零掌握JNI开发:手把手教你Java调用C/C++的完整流程

在Java开发中,我们有时需要调用C/C++等本地代码来实现高性能计算、访问系统底层功能或复用已有的本地库。这时,Java Native Interface (JNI)就成为了连接Java世界与本地代码世界的桥梁。

Mr_aliea的专栏 1039

【Java基础】JNI机制开发指南—认识JNI原理及如何用 Java 调用 C 的动态链接库

java是一种跨平台的语言,那么它为什么能做到跨平台,`实际上是因为不同的平台(windows、linux、mac-os)java有不同的解释器,对应java不同的虚拟机(JVM)`,这样,就可以做到`源代码文件(.java)只需一次编译成字节码文件(.class),就可以在不同的平台运行 `。而java不是万能的,有些操作需要调用`操作系统平台API`实现,`JNI`就是Java用于和`其他语言`进行互操作的API,称为`Java Native Interface (Java本地接口)`

墩墩分墩 4406
上一篇: Ubuntu16.10安装Drcom客户端
下一篇: 冒泡、插入、选择排序及其改进
Findway_
博客等级 码龄10年 36粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值