android常见问题之jni读取assets资源文件

Android资源图片读取机制 在新建一个Android项目时,在res目录下会自动生成几个drawable文件夹,drawable-ldpi,drawable-mdpi,drawable-hdpi,一直以来都对此不太清楚,图片应该放到哪个文件夹下面,有什么不同的影响?以前一直都是干脆再新建一个不带后缀的drawable文件夹,图片都丢进去,现在决定彻底搞清楚这个事儿。   1、基础知识 density(密度):简单的说就 阅读详情

assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取的。这里介绍下怎么在jni内使用 ndk自带api的接口函数读取assets资源文件,和libzip库函数的使用,可以用来读创建修改压缩文档,这里也是以读取apk安装包内的资源文 件为例。

1 用ndk自带的接口函数读apk包

从2.3开始提供这些接口函数,具体看头文件assert.h android/asset_manager.h android/asset_manager_jni.h,可以参考ndk自带例子中samples/native-audio/ jni/native-audio-jni.c。

 
  1. /************************************** 
  2. * Function Name  : java_com_fontlose_ReadAssets_readFromAssets 
  3. * Description    : void  readFromAssets(AssetManager ass,String filename); 
  4. * Input          : AssetManager对象 filename资源名 
  5. * Output         : None 
  6. * Return         : None 
  7. ***************************************/  
  8. void  Java_com_fontlose_ReadAssets_readFromAssets(JNIEnv* env,jclass tis
  9. ,jobject assetManager,jstring filename) 
  10. { 
  11.    LOGI("ReadAssets");  
  12.    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
  13.    if(mgr==NULL) 
  14.    { 
  15.       LOGI(" %s","AAssetManager==NULL"); 
  16.       return ; 
  17.    } 
  18.   
  19.     /*获取文件名并打开*/ 
  20.    jboolean iscopy; 
  21.    const char *mfile = (*env)->GetStringUTFChars(env, filename, &iscopy); 
  22.    AAsset* asset = AAssetManager_open(mgr, mfile,AASSET_MODE_UNKNOWN); 
  23.    (*env)->ReleaseStringUTFChars(env, filename, mfile); 
  24.    if(asset==NULL) 
  25.    { 
  26.       LOGI(" %s","asset==NULL"); 
  27.       return ; 
  28.    } 
  29.    /*获取文件大小*/ 
  30.    off_t bufferSize = AAsset_getLength(asset); 
  31.    LOGI("file size         : %d\n",bufferSize); 
  32.    char *buffer=(char *)malloc(bufferSize+1); 
  33.    buffer[bufferSize]=0; 
  34.    int numBytesRead = AAsset_read(asset, buffer, bufferSize); 
  35.    LOGI(": %s",buffer); 
  36.    free(buffer); 
  37.     /*关闭文件*/ 
  38.    AAsset_close(asset); 
  39. } 

在应用程序内使用定义和使用如下

 
  1. public native void  readFromAssets(AssetManager ass,String filename);  

readFromAssets(getAssets(),"log.txt");

logcat测试结果

12-15 15:27:33.290: INFO/ReadAssets(3570): ReadAssets
12-15 15:27:33.290: INFO/ReadAssets(3570): file size         : 138
12-15 15:27:33.290: INFO/ReadAssets(3570): : 。。。。。。。。。。。。。。。。
12-15 15:27:33.290: INFO/ReadAssets(3570): 这个例子从jni读取assets内文件
12-15 15:27:33.290: INFO/ReadAssets(3570): 。。。。。。。。。。。。。。。。

2 使用libzip库读apk包
     libzip 使用 C 库来 读创建修改压缩文档,关于libzip在andorid的移植可以参考老外做的android-ndk-assets.zip这个工程,已在NDK下可以编译了,修改下编译生成libzip.so,利用libzip.so和zip.h建立工程,使用libzip还可以读取apk包内其他压缩文件如AndroidManifest.xml布局xml等。

 
  1. /************************************* 
  2. * Function Name  : java_com_fontlose_ReadAssets_readFromAssetsLibzip 
  3. * Description    : void readFromAssetsLibzip(String apkpath,String filename); 
  4. * Input          : apkpath路径 filename 资源名 
  5. * Output         : None 
  6. * Return         : None 
  7. **************************************/  
  8. void  Java_com_fontlose_ReadAssets_readFromAssetsLibzip(JNIEnv* env
  9. ,jclass tis,jstring assetpath,jstring filename) 
  10. { 
  11.    LOGI("ReadAssets");  
  12.   int i=0; 
  13.    jboolean iscopy; 
  14.    const char *mpath = (*env)->GetStringUTFChars(env, assetpath, &iscopy); 
  15.    struct zip* apkArchive=zip_open(mpath, 0, NULL);; 
  16.    (*env)->ReleaseStringUTFChars(env, filename, mpath); 
  17.  
  18.    struct zip_stat fstat; 
  19.    zip_stat_init(&fstat); 
  20.  
  21.    int numFiles = zip_get_num_files(apkArchive); 
  22.    LOGI("File numFiles %i \n",numFiles); 
  23.    for (i=0; i<numFiles; i++) { 
  24.      const char* name = zip_get_name(apkArchive, i, 0); 
  25.      
  26.      if (name == NULL) { 
  27.       LOGE("Error reading zip file name at index %i : %s", zip_strerror(apkArchive)); 
  28.       return; 
  29.     } 
  30.     
  31.     zip_stat(apkArchive,name,0,&fstat); 
  32.     LOGI("File %i:%s Size1: %d Size2: %d", i,fstat.name,fstat.size ,fstat.comp_size)  ; 
  33.    } 
  34.  
  35.    const char *fname = (*env)->GetStringUTFChars(env, filename, &iscopy); 
  36.    struct zip_file* file = zip_fopen(apkArchive, fname, 0); 
  37.   
  38.    if (!file) { 
  39.      LOGE("Error opening %s from APK", fname); 
  40.      return; 
  41.     } 
  42.  
  43.    zip_stat(apkArchive,fname,0,&fstat); 
  44.    (*env)->ReleaseStringUTFChars(env, filename, fname); 
  45.    char *buffer=(char *)malloc(fstat.size+1); 
  46.    buffer[fstat.size]=0; 
  47.    int numBytesRead =  zip_fread(file, buffer,fstat.size);; 
  48.    LOGI(": %s\n",buffer); 
  49.    free(buffer); 
  50.    zip_fclose(file); 
  51.    zip_close(apkArchive); 
  52. } 

在应用程序内使用定义和使用如下

 
  1. public native void  readFromAssetsLibzip(String apkpath,String filename); 

readFromAssetsLibzip(getPackageResourcePath(),"assets/log.txt");

logcat测试结果

12-15 15:28:03.430: INFO/ReadAssets(3570): ReadAssets
12-15 15:28:03.440: INFO/ReadAssets(3570): File numFiles 14
12-15 15:28:03.440: INFO/ReadAssets(3570): File 0:assets/log 2.txt Size1: 138 Size2: 55
12-15 15:28:03.440: INFO/ReadAssets(3570): File 1:assets/log.txt Size1: 138 Size2: 55
12-15 15:28:03.440: INFO/ReadAssets(3570): File 2:res/layout/main.xml Size1: 956 Size2: 337
12-15 15:28:03.440: INFO/ReadAssets(3570): File 3:AndroidManifest.xml Size1: 1348 Size2: 531
12-15 15:28:03.440: INFO/ReadAssets(3570): File 4:resources.arsc Size1: 1480 Size2: 1480
12-15 15:28:03.440: INFO/ReadAssets(3570): File 5:res/drawable-hdpi/icon.png Size1: 3966 Size2: 3966
12-15 15:28:03.440: INFO/ReadAssets(3570): File 6:res/drawable-ldpi/icon.png Size1: 1537 Size2: 1537
12-15 15:28:03.440: INFO/ReadAssets(3570): File 7:res/drawable-mdpi/icon.png Size1: 2200 Size2: 2200
12-15 15:28:03.440: INFO/ReadAssets(3570): File 8:classes.dex Size1: 3468 Size2: 1680
12-15 15:28:03.440: INFO/ReadAssets(3570): File 9:lib/armeabi/libzip.so Size1: 217246 Size2: 46140
12-15 15:28:03.440: INFO/ReadAssets(3570): File 10:lib/armeabi/libreadres.so Size1: 3820 Size2: 1779
12-15 15:28:03.440: INFO/ReadAssets(3570): File 11:META-INF/MANIFEST.MF Size1: 852 Size2: 443
12-15 15:28:03.440: INFO/ReadAssets(3570): File 12:META-INF/CERT.SF Size1: 905 Size2: 487
12-15 15:28:03.440: INFO/ReadAssets(3570): File 13:META-INF/CERT.RSA Size1: 776 Size2: 606
12-15 15:28:03.440: INFO/ReadAssets(3570): : 。。。。。。。。。。。。。。。。
12-15 15:28:03.440: INFO/ReadAssets(3570): 这个例子从jni读取assets内文件
12-15 15:28:03.440: INFO/ReadAssets(3570): 。。。。。。。。。。。。。。。。

上面例子使用android.mk如下

 

  1. LOCAL_PATH := $(call my-dir) 
  2. include $(CLEAR_VARS) 
  3. LOCAL_MODULE    := readres 
  4. LOCAL_SRC_FILES := readres.c  
  5. LOCAL_C_INCLUDES+= /opt/android-ndk-r5/platforms/android-9/arch-arm/usr/include 
  6. LOCAL_LDLIBS    += -L/opt/android-ndk-r5/platforms/android-9/arch-arm/usr/lib/ -llog 
  7. LOCAL_LDLIBS    += -landroid 
  8. LOCAL_LDLIBS    += -lz  
  9. LOCAL_LDLIBS    += -L$(LOCAL_PATH) -lzip 
  10. include $(BUILD_SHARED_LIBRARY) 

c++读取android的assets的资源文件 c++读取android的assets资源文件 阅读详情

相关推荐

Android apk安装过程及Java JNI读取安装包内assets资源文件的两种方法 附源码实例

Android apk安装过程及Java JNI读取安装包内assets资源文件的两种方法 附源码实例

hgfygfc的博客 617

Android JNI C层用libzip读取ZIP类型文件

采用libzip库可直接在Android JNI C层直接解压读取zip压缩文件。域内外逛了一圈都没找到能用的so库。。相关资源也没几个。。自己下载源码编了个方便大家。库包含该库的全部功能。 编译版本:libzip-1.7.0 内含android全部平台的.so动态库,.a静态库。包含头文件。亲测可用 libzip官方网站地址:https://libzip.org/ android平台库库下载地址:; Demo下次有时间再上。 ...

u011046184的博客 1864

Java和JNI读取android apk里assets文件夹示例demo

Java和JNI读取android apk里assets文件夹示例demo,参见博客详解: http://blog.youkuaiyun.com/yanzi1225627/article/details/20577059

Android 中通过JNI调用OpenCV处理图片1

上篇提过,通过部署好了OpenCV的动态链接库,就是加入include和so文件,不用加入moudle; android studio使用jni调用opencv库实现图片转换【详细实例】(二)

loovelj的博客 5759

android jni使用libzip读取压缩文件

例子通过jni调用libzip库读取压缩文件,和通过ndk自带api接口读取assets资源文件,附测试工程。

STM32CubMX_MQ135检测空气质量

一、MQ135简介 MQ135是测量空气污染情况常用的一个传感器,具有代表性,价格低,寿命长,敏感度也OK,主要用于测量空气中二氧化碳,氮氧化物,氨气,酒精,苯类等。这几样气体可以说都属于家用空气污染测定中的重要成份,因此用这个传感器刚刚好。 MQ135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。 注: pm2.5的话要用另外类型

W_Oilpicture的博客 3万+

android常见问题之jni读取assets资源文件(附源码)

assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取的。这里介绍下怎么在jni内使用ndk自带api的接口函数读取assets资源文件,和libzip库函数的使用,可以用来读创建修改压缩文档,这里也是以读取apk安装包内

fontlose的专栏 2万+

Jasypt 开源加密库使用教程

Jasypt 加密框架概述 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。 2、有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。 3、

蚩尤后裔-汪茂雄 3万+

(转)android常见问题之jni读取assets资源文件(附源码)

(转)http://blog.youkuaiyun.com/fontlose/article/details/6686161   assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取的。这里介绍下怎么在jni内使用ndk自带api的接口函数读取assets资源文件,和libzip库函数的使用,可以用来读创建修改压缩文档,这里也是以读取apk安装包内...

weixin_30607659的博客 136

四参数与七参数坐标转换含义及区别

一.前言 不同坐标系,其椭球体的长半径,短半径和扁率是不同的。比如我们常用的四种坐标系北京54、西安80、WGS84、CGCS2000所对应的椭球体,它们的椭球体参数就各不相同。而不同空间直角坐标系之间的转换一般通过七参数或者四参数来实现坐标转换。 二.四参数转换 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在该模型中有四个未知参数,即: (1)两个坐标平...

尘海折柳的博客 1万+

AgentScope 实战训练营-构建元规划智能体(Meta Planner Agent)—— 从 0 到 1 完整实现

本文介绍了基于AgentScope框架开发的元规划智能体(Meta Planner Agent)系统。该系统通过任务拆解和子代理编排机制,实现复杂任务的自动化处理。核心架构分为用户层、规划器层和子代理层,其中规划器作为"项目经理"负责任务分解、创建子代理并协调执行流程。关键技术包括AgentScope多智能体框架、DashScope大语言模型、PlanNotebook计划管理工具等。

program哲学 356

Android开发在C层读取资源文件的两种方式

获取资源文件 Android应用往往会有很多资源文件需要使用,这些资源文件一般会放在assets目录编进apk中,当apk中使用了so库的时候,由于编进apk的资源文件没有固定的目录,因此不能在C层通过设置路径的方式读取;这里提供两种C层读取资源文件的方式,仅供参考。 1、C层获取AAssetManager指针 JNI作为C和Java的桥梁可以完成许多工作,因此第一种方法可以通过Java层向C层传...

Blog of Chauncy Wang 3701

一种独特机理驱动的化学反应分类器详解

代码位置第 47-300+ 行// atom_494: 硫原子,度数=2,化合价=2,无H,无电荷!// atom_35: 氧原子,度数=1,1个H,无电荷// atom_347: 氧原子,度数=2,无H,无电荷!→atom_494()[OD1h1+0]→atom_35()→atom_347()特性传统方法(MCS)NameRXN(机理驱动)匹配策略最大公共子结构原子类型模式 + 操作码时间复杂度O(n) - 线性扫描机理理解无内置化学机理原子映射需额外计算自动推导准确性结构相似。

ASKCOS博客 156

Android ndk下用AssetManager读取assets的资源

【备忘】Android ndk下用AssetManager读取assets的资源。 @import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 在使用 cocos2d

luxiaoyu_sdc的专栏 5923

079、镜头阴影校正(LSC)精讲:径向衰减模型、增益矩阵生成与产线标定技巧

《镜头阴影校正(LSC)实战精要》 本文从实际案例出发,深入解析镜头阴影校正的核心技术与产线应用。作者通过一个典型故障案例(0.05mm镜片偏移导致LSC失效)揭示了LSC不仅是数学问题,更是光学-机械-工艺耦合系统。 【关键技术点】 模型优化:提出"径向+切向"双分量模型替代传统cos⁴θ模型,采用5阶多项式拟合径向衰减,1阶线性补偿切向误差 增益矩阵生成:采用自适应网格技术,在边缘区域加密网格,结合中值滤波与高斯平滑消除噪声干扰 产线标定:强调光源均匀性校准(积分球vs平板光源)、坏点预处理、温度补偿等

zzfmlxs的博客 102

Docker(八):Docker Compose(容器编排) 管理多容器应用—实战案例演示

🟢 Docker(八):Docker Compose(容器编排) 管理多容器应用—实战案例演示

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6万+

android JNI开发C++代码对assets文件的访问

Android应用往往会有很多资源文件需要使用,这些资源文件一般会放在assets目录编进apk中,当apk中使用了so库的时候,由于编进apk的资源文件没有固定的目录,因此不能在C层通过设置路径的方式读取;这里提供两种C层读取资源文件的方式,仅供参考。 # 方法一(通过绝对路径访问) 由于在apk的安装过程中assets中的文件并没有从apk包中解压出来,所以在JNI的C++代码中不能按照原始的路径直接进行访问,一种常用的方法为将assets中的文件复制到sdcard的目录下,然后传递绝对路径给JNI中的

ZzzzjQqqq的博客 1207

【异常】OpenClaw调用火山引擎大模型提示词 Agent failed before reply: All models failed (6): volcengine/kimi-k2-5-26

摘要: 本文针对OpenClaw调用火山引擎大模型服务时触发的全量熔断报错(All models failed)提供全链路排查方案。报错核心为服务熔断(cooldown)和模型不可用(model_not_found),主要源于账号权限、API凭证失效或模型标识错误。解决方案按优先级分步实施:1)校验账号状态与AK/SK有效性;2)核对官方模型标识;3)重启服务解除熔断;4)修复配置文件;5)通过原生API测试定位网络或服务端问题。日志分析(openclaw logs)可快速识别HTTP状态码(如401/40

奶爸的编程之路,也就一周冷个三天 837

jni读取assets资源文件

assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取的。这里介绍下怎么在jni内使用ndk自带api的接口函数读取assets资源文件,和libzip库函数的使用,可以用来读创建修改压缩文档,这里也是以读取apk安装包内的资源文件为例。 1 用ndk自带的接口函数读apk包 从2.3开始提供这些接口函数,具体看头文件asser

ShaderJoy 的兴趣技术杂货铺 2755

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

android jni assets文件路径,Android NDK从Assets目录下读取shader文件 ? 琢 · 磨

好久没写文章了,最近花了几天时间来学习Android NDK下的OpenGL ES 2.0编程,其实有Opengl基础的人转战ES是很容易上手的,特别是NDK用的也是c/c++。在写shader的时候,我们大都习惯从外部读取shader文件,所以我的想法是把shader文件打包进apk中安装时自动释放然后找到文件路径,在ndk中指定我要读的文件名,然后把读取内容交给ndk来处理。这里关于文件定位有...

weixin_42239175的博客 748

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JNI开发笔记(八)--Java读取txt文件进行JNI测试

Java读取txt文件进行JNI测试引前言1. 新建assets文件夹2. 载入测试文件3. 建立文件读取方法4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–Android Studio安装与环境搭建 JNI开发笔记(二)–创建JNI基础工程并运行 JNI开发笔记(三)–JNI工程的框架分析 JNI开发笔记(四)–实现一个简单的JNI工程并生成so库 JNI开发笔记(五)–JNI语法总结 JNI开发笔记(六)–一种更规范的so库生成方法 JNI开发笔记(七)–aar库的生成和调用

魔法师の屋子★↓☆ 4915

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...

Android apk安装过程及Java、JNI读取安装包内assets资源文件的两种方法(附源码实例)

问题背景:在PC上的程序可以轻松使用./或不用指明,默认读取的就是程序所在路径内的文件。但在Android上,应用程序被打包成apk,程序运行时无法直接获取apk(压缩包)内的文件。但在一些特殊场合,如加载图像处理训练好的分类器、模型等数据,要求每个apk到手机上都能运行,就必须解决这个问题。本文深入研究apk安装过程,给出三种方法解决这个问题。一、android apk安装过程 Android

yanzi1225627的专栏 2万+

android jni 读写资源文件(assets)

想在jni下想读写打包的资源文件(assets目录底下的文件)并非像读写普通文件一样(fopen相关函数)。因为所有的代码与资源都会被打包到一个apk文件里。所以访问资源就必须对这个包进行读写操作。目前据我所知的有两种方法:1,用zlib库读写apk包;2,用ndk自带库AAssetManager读写apk包;(只有API版本为9或以上的可用 Android 2.2以上)方法1:首先要确定apk包的位置String strCodePath = getApplication().getPackageCodeP

zjhlogo的专栏 3687

FFmpeg读取Assets资源文件

在Android开发中我们经常把原生资源文件放在assets目录下以供需要时读取,通过API提供的方法可以非常方便获得InputStream或FileDescriptor(文件标识符),但是在使用FFmpeg读取Assets文件时却遇到了困难。主要原因在于FFmpeg读取媒体文件时是通过传入的url来判断IO协议的,也就是说如果想要使FFmpeg能够正确读取Assets文件就需要选择合适的IO协议来构造url并传入方法中,然而实际操作起来貌似问题多多。调用。

qq_52703909的博客 1709

android jni assets文件路径,android jni 读写资源文件(assets)

想在jni下想读写打包的资源文件(assets目录底下的文件)并非像读写普通文件一样(fopen相关函数)。因为所有的代码与资源都会被打包到一个apk文件里。所以访问资源就必须对这个包进行读写操作。目前据我所知的有两种方法:1,用zlib库读写apk包;2,用ndk自带库AAssetManager读写apk包;(只有API版本为9或以上的可用 Android 2.2以上)方法1:首先要确定apk包...

weixin_42504649的博客 717

android 通过路径获取资源,两种Android资源文件的读取方法

Android软件通常通过SD卡处理大量资源,例如在线下载资源到SD卡,而APK嵌入式资源或二进制文件通常也可以使用以下的方法,那么两种Android资源文件的读取方法大家都了解吗?下面就让爱站技术频道小编带你一起来了解一下吧!Sam在Android开发中,有两种处理资源文件的方式。其一,是将所有资源文件以及JNI程序放置于一个单独的资源包。使用到他们时,使用文件方式读取。或者直接使用C++层代码...

weixin_42322347的博客 2684
上一篇: 在win2008 r2中安装windows phone 7开发工具
下一篇: win7 x64 下VC6的调试程序无法退出的问题
happy hell
博客等级 码龄23年 136粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值