c++代码通过JNI调用Java代码时用到的签名信息如何获取

C++学习(四七三)jni调用java方法 1、方法签名 在app\build\intermediates\classes\debug的路径下,运行javap -s yys.com.myjnidemo.JniDataUtil,就会输出如下的方法签名描述: public class yys.com.myjnidemo.JniDataUtil { public yys.com.myjnidemo.JniDataUtil(); descriptor: ()V public static native java.lang.String 阅读详情

大家都知道,如果在c++里通过JNI的方式调用Java代码时,需要用到java类和类成员方法的签名信息。但是这些签名信息的可读性确实太差了,如果要自己人工来根据Java类或者类成员方法来写这些签名信息那确实是一件非常痛苦的事情。那有办法能简单地得到这些Java类和成员方法的签名信息吗?有的,下面我就介绍下如何获取签名信息。

1、编译Java代码,生成中间代码class文件

2、在cmd中切换到目标class文件所在目录

3、执行命令javap-s -p 类名,如javap-s -p Test即可得到Test类即它的成员方法的签名信息如下:

     publicfinal class com.my.android.Test extends java.lang.Object{

     ......

    }

4、获取Java类名信息的时候,就可以根据步骤3中显示的Test类的签名信息,通过“com/my/android/Test”来FindClass Test

     jclass class_Test = env->FindClass("com/my/android/Test");

5、通过GetMethodID获取类的成员函数与步骤4类似,拿到步骤3中显示的类成员函数的签名信息调用GetMethodID就可以了。

  

Linux下C++调用Java简单实例(jni) 1. Java端,假设工作目录为/home 1)  z 阅读详情

相关推荐

AndroidStudio jni C++与Java互相调用

jni C++与Java互相调用

qq_36383272的博客 2031

jni开发涨获取Java类的方法的Signature签名信息

在jni中,刚开始很困惑 (*env)->GetMethodID(env, jclazz, "getRandomNumber", "(I)I"); 这类代码的第三个参数为什么要这样写?是有什么特殊意义? 后来才明白这是C访问java方法的Signature签名。我的理解就是唯一性吧(不知道对不对。。。).此文教大家这么获取这个Signature。在CMD中指向项目中bin目录下的classes目

帅呆sky的博客 2177

Android JNI C/C++调用Java方法

JNI环境的支持 Android JNI编程从Java方法来调用native方法是比较容易的, 因为Java本身就提供了native关键字作为索引,只要正确的对应Java方法和native方法的包名,做到这一步并不难. 而从C/C++方法调用Java方法则稍复杂一点,因为C/C++没有提供跨语言调用的直接支持,所以需要由Java的JNI运行环境来提供帮助. 每一个JNI native方法的

sliver.chen的博客 2530

C++转JAVA的转换方法及约定

1.基本思想: 1.1 使对象对应 每出现一个C++类就写一个JAVA类, JAVA类的行为完全模仿C++类的行为. 而且要保证C++的对象的生存期至少比JAVA长, 而且能够保证使所有动态分配出来的C++对象有机会得到析构。   实现的方法是在每个JAVA类中添加一个int 类型的变量 ptr(参见表2.1中的part4),ptr指向该JAVA类所对应的C++对象。ptr并不在JAVA中

乔成磊的专栏 2471

使用 Java 原生接口(JNI)调用其他语言的原生代码

Java原生接口(JNI)是一个允许Java代码与C/C++等原生代码交互的框架,适用于访问操作系统功能、集成现有代码或性能优化等场景。尽管Java 22及以上版本提供了外来函数和内存API作为替代,JNI在遗留系统和特定用例中仍不可或缺。使用JNI的基本步骤包括编写Java代码、编译生成头文件、实现C/C++函数、编译为共享库并运行程序。最佳实践包括谨慎使用JNI、使用现代工具、平台特定编译、错误处理和内存管理。JNI虽强大,但会引入复杂性、降低可移植性,并需手动管理内存,开发者应权衡其优缺点,必要时考虑

静水深流 856

Android利用JNI实现java调用C或C++

Android利用JNI实现java调用C或C++ Android通过JNI来实现Java层调用C层代码,我们必须创建c代码,然后编译so库,编写JNI中的代码,最后Java层通过System.loadLibrary()方法加载so动态库,即可实现。 编写一个具有so,jni , java整体模块,一般可以这样来做: (1)编写Java层代码,里面主要实现两个步骤,一个是定义na

vane918的博客 1330

jni获取Java类的方法的Signature

指向项目的bin目录下的classes目录 Javap -s -classpath . -p packagename.classname -s表示打印签名信息 -p表示打印所有函数和成员的签名信息,默认只打印public的签名信息。 其中Java程序中参数类型和其对应的值如下: Signature  Java中的类型 Z       boolean B       b

QDKCY_RainBoy的专栏 1563

Android JNI签名获取与AES加密实战详解

Android系统要求所有安装在设备上的应用(APK文件)都必须经过签名,否则系统将拒绝安装。这种机制不仅用于验证应用的发布者,还用于确保应用内容在发布之后未被修改。在CERT.SF文件中,存储的是中每个条目的摘要摘要。我们可以通过比对这些摘要来验证签名是否一致。// 解析CERT.SF中的摘要摘要// 然后与MANIFEST.MF的摘要进行比对// 返回0表示一致,-1表示不一致return 0;通过本章的学习,我们掌握了如何使用javah。

weixin_28939623的博客 823

javap获取JAVA方法JNI方法签名

通过使用 javap -s 命令,你可以查看 Java 类中 JNI 方法的签名信息。请注意,只能从编译好的类文件中获取 JNI 方法的签名,因为它们是在编译过程中生成的。JNI(Java Native Interface)允许 Java 代码与本地代码进行交互,因此可以使用 javap 来查看 JNI 方法的签名信息。确保你已经编译了包含 JNI 方法的 Java 类,并生成了对应的 .class 文件,JAVA文件通过javac生成对应的.class 文件。

wolf0706的专栏 540

C++与Java交互的实践指南:深入JNI调用

Java语言自诞生以来便以其平台无关性、丰富的类库和先进的垃圾回收机制受到开发者的青睐。平台无关性是指Java编写的程序可以在任何安装了Java虚拟机(JVM)的系统上运行。这为开发者提供了一种可以跨平台运行的解决方案,是Java最大的优势之一。然而,这种优势背后也有其局限性。首先,虽然Java平台提供了丰富的API和类库,但在某些特定的场合,这些库并不能完全满足需求。例如,Java标准库没有提供一些底层的系统调用、硬件接口或是与操作系统紧密相关的功能,这时候开发者就需要借助其他语言编写相应的部分。

weixin_31163455的博客 772

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控与演化机制

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控与演化机制。

Pangenes的博客 1332

Android JNI复杂用法,回调,C++中调用Java方法

/创建对象的本地变量//获取类对象I)V");上面(1)和(2)是没什么研究价值的,NewGlobalRef和FindClass都是固定的写法。(3)和(4)的不用方法的调用区别就比较大了,使用不同的api函数还可以修改Java的变量属性。静态方法和动态方法调用的api函数也不一样,有返回值的方法和没有返回值的方法调用的api函数也是不一样的。并且Java方法或者变量即使是private修饰的也不影响cpp调用过去,因为反射是不受修饰符影响的。

wenzhi的博客 3168

实战指南:轻松破解DataDome滑块验证码的关键步骤

本文详细介绍了破解DataDome滑块验证码的关键步骤,包括理解其工作原理、准备工作、参数获取与配置、完整破解流程及API调用。通过使用Capsolver服务和模拟真实用户行为,帮助开发者有效绕过这一反机器人机制,同时强调了法律与道德考量。

weixin_30415113的博客 478

Java使用JNI调用C++的完整流程

JNI其实是Java NativeInterface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是C/C++)。           Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决Java对本地操作的一种方法就是JNI。           Java通过JNI调用本地方

A cyclist amateur photographer 2915

Mac上MySQL出现secure-file-priv为null

在使用MySQL导入导出文件时出现了错误,原因是没有配置secure-file-priv。 我的MySQL版本是8.0.13,使用如下命令查看secure-file-priv。 结果发现secure-file-priv为空,此时需要为它配置一个文件夹。 解决方案: 1)到MySQL的安装目录中去,Mac中是的是 /usr/local/mysql/support-files,该目录下有一...

zhangvalue的博客 5883

【机器学习—评估指标】混淆矩阵、准确率、精确率、召回率、F1分数、ROC曲线和AUC

机器学习评价指标是衡量模型性能的关键工具。本文介绍了常见指标及其计算方法:1.混淆矩阵展示分类预测结果分布,包含TP、TN、FP、FN四个基础指标;2.准确率反映整体预测正确率;3.精确率关注预测正例的准确性;4.召回率衡量正例检出能力;5.F1分数综合平衡精确率和召回率;6.ROC曲线通过TPR与FPR的权衡关系评估模型性能,AUC值量化区分能力。文章详细说明了各指标的定义、计算公式、适用场景及局限性,并通过Python代码示例演示了具体实现方法,特别对ROC曲线和AUC的计算原理进行了深入解析。

weixin_51375278的博客 6743

java通过jni调用c++并联调

1 jni 1.1 jni简介 本节摘抄自:https://blog.youkuaiyun.com/qq_28261343/article/details/77971823 JNI是Java Native Interface的缩写,中文翻译Java本地接口, 也有译为Java本地调用。JNI是Java语言中的一门强大的技术,由于Android上层采用Java语言实现,所以也可以在Android中使用这门技术。 JNI技术主要是完成Java代码与native代码进行交互,简单说就是用Java代码调用native语言编写的

cdknight_happy的专栏 2172

关于【中孚计算机终端保密检查系统】的卸载

卸载中孚计算机终端保密检查系统

码农之路,向死而生 4万+

JNI数据类型及Java使用jni调用c++接口

基本数据类型可以进行直接使用,不需要进行互相转换。比如:int、float、double、boolean。使用枚举时记得在使用的地方添加自己定义的枚举的头文件。C++数据与Java数据转换参考下面《选中c++项目点击鼠标右键 > 属性。转Java double[]1.选中C++项目鼠标右键。这里选择生成对应的动态库。

sipengfei_的博客 934

【重温童年】基于tkinter模块设计的Q宠大乐斗武器升星模拟器:重温经典,畅享休闲时光

与传统的Q宠大乐斗不同,这款模拟器还加入了一个创新的功能——自定义升星概率。玩家可以根据自己的喜好和策略,为不同的武器设置不同的成功率和降级率。比如,你可以将“嗜血”这把武器的升星难度设置得极高,以体现其稀有性和强大威力;也可以将“平底锅”这样的普通武器设置得相对容易升星,让玩家在升级过程中感受到更多的成就感。这种自定义的概率设置,不仅增加了游戏的趣味性和挑战性,还让玩家在升级过程中有了更多的策略和选择。你可以根据自己的武器库和卷轴数量,制定出最合适的升级计划,从而在游戏中占据先机。

nmdbbzcl的博客 1235

YOLOv11损失函数原理与源码解读:从调参血泪史到源码级优化

本文深入解析YOLOv11目标检测模型的损失函数设计,揭示其相比前代的关键改进。重点剖析了回归损失中动态权重的小目标优化、分类损失的带温度系数softmax、以及目标损失的自适应阈值机制等创新点。作者通过源码分析指出常见实现陷阱,如梯度回传的正确处理方式、标签分配的匹配策略等。结合实战经验,给出针对小目标检测、类别误判等典型问题的调参建议,并分享实用的调试工具代码片段。最后强调损失函数调参需结合具体任务,指出后处理对实际部署效果的重要影响。全文以工程实践为导向,为开发者提供可直接落地的优化思路。

as1225120794的博客 439

【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )

I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI 函数签名规则 V . javap 获取函数签名 ( 推荐 ) VI . 反射获取对象方法 ( GetMethodID ) VII . 反射获取类静态方法 ( GetStaticMethodID ) VIII . 调用 Java 对象方法 ( CallXxxMethod ) IX . 调用 Java 类静态方法 ( Ca

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2928

解决Office 365 SMTP问题:C#邮件发送详解

本文介绍了如何在C#中使用Office 365 SMTP服务发送邮件。重点讲解了正确配置SMTP客户端的关键参数:必须使用587端口并启用TLS加密(EnableSsl=true),同时通过NetworkCredential进行身份验证。虽然SmtpClient已不推荐用于新项目,但本文提供的代码示例仍适用于临时项目或系统维护,并建议未来可考虑使用MailKit等现代邮件库。文章还包含了错误处理机制,确保程序健壮性。

2501_90323865的博客 139

Android JNI(三):Java与Native相互调用

1、注册native函数 2、JNI中的签名 3、native代码反调用Java层代码 下面我们就进一步了解下一下JNI的调用原则,要想了解JNI的调用原则, 前面我们说了JNI中的JNIEnv以及Java类型和native中的类型映射关系。下面我们先来看注册native函数 一、注册native函数 当Java代码中执行Native的代码的时候,首先是通过一定的方法来找到这些native方法。而注册native函数的具体方法不同,会导致系统在运行时采用不同的方式来寻找这些native方法。..

天涯芳草 3378

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Jni之在c++中调用java代码

第一步:完成java代码 public class JniMain { private static int staticIntField=300; static{ System.loadLibrary("JniFunc"); } public static native JniTest createObject(); public static void main(Stri

u014609356的专栏 624

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux上c++通过JNI调用java代码笔记

2 最近工作中,需要用到c++通过JNI去访问Java代码,在这里做下自己过程中遇到的问题,做个总结; 1.linux配置java jdk环境 第一步:去官网下载对应的linux包 https://www.oracle.com/java/technologies/javase-jdk11-downloads.html (这里我用的jdk11) 第二步:解压放在/usr/lib/下面 第三步:配置环境(/etc/profile) export JAVA_HOME=/usr/lib/jd...

Tjmies的博客 984

深度学习工具包 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")

上一篇: Android Service
下一篇: RSA密钥长度、明文长度和密文长度
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值