当前位置: 首页 > news >正文

Android JNI C++读写本地文件

文章目录

  • 小结
  • Android JNI使用C++
  • Android JNI读写本地文件
    • 有关权限
    • 创建文件夹
    • 访问 /storage/emulated/0/
    • 访问/data/data/example.jniwritefile/
    • 时间戳
    • Can't determine type for tag
  • 参考

小结

进行Android JNI C++读写本地文件,取得了想要的效果。

Android JNI使用C++

对于Android的本地文件的操作,由于涉及到安全问题,并不是十分直接。
具体创建Andriod JNI应用,可以参考CSDN: android studio 3.2 使用jni 和 Add C and C++ code to your project

Android JNI读写本地文件

有关权限

要使用Android JNI读写本地文件,首先需要解决权限和授权的问题。否则会出现各种各样的错误。我碰到的有errno = 2 (No such file or directory) 和 errno = 13 (Permission denied),具体错误码如下:

errno错误码:
errno0 :     Successerrno1 :     Operation not permittederrno2 :     No such file or directoryerrno3 :     No such processerrno4 :     Interrupted system callerrno5 :     Input/output errorerrno6 :     No such device or addresserrno7 :     Argument list too longerrno8 :     Exec format errorerrno9 :     Bad file descriptorerrno10 :    No child processeserrno11 :    Resource temporarily unavailableerrno12 :    Cannot allocate memoryerrno13 :    Permission deniederrno14 :    Bad addresserrno15 :    Block device requirederrno16 :    Device or resource busyerrno17 :    File existserrno18 :    Invalid cross-device linkerrno19 :    No such deviceerrno20 :    Not a directoryerrno21 :    Is a directoryerrno22 :    Invalid argumenterrno23 :    Too many open files in systemerrno24 :    Too many open fileserrno25 :    Inappropriate ioctl for deviceerrno26 :    Text file busyerrno27 :    File too largeerrno28 :    No space left on deviceerrno29 :    Illegal seekerrno30 :    Read-only file systemerrno31 :    Too many linkserrno32 :    Broken pipeerrno33 :    Numerical argument out of domainerrno34 :    Numerical result out of rangeerrno35 :    Resource deadlock avoidederrno36 :    File name too longerrno37 :    No locks availableerrno38 :    Function not implementederrno39 :    Directory not emptyerrno40 :    Too many levels of symbolic linkserrno41 :    Unknown error 41errno42 :    No message of desired typeerrno43 :    Identifier removederrno44 :    Channel number out of rangeerrno45 :    Level 2 not synchronizederrno46 :    Level 3 haltederrno47 :    Level 3 reseterrno48 :    Link number out of rangeerrno49 :    Protocol driver not attachederrno50 :    No CSI structure availableerrno51 :    Level 2 haltederrno52 :    Invalid exchangeerrno53 :    Invalid request descriptorerrno54 :    Exchange fullerrno55 :    No anodeerrno56 :    Invalid request codeerrno57 :    Invalid sloterrno58 :    Unknown error 58errno59 :    Bad font file formaterrno60 :    Device not a streamerrno61 :    No data availableerrno62 :    Timer expirederrno63 :    Out of streams resourceserrno64 :    Machine is not on the networkerrno65 :    Package not installederrno66 :    Object is remoteerrno67 :    Link has been severederrno68 :    Advertise errorerrno69 :    Srmount errorerrno70 :    Communication error on senderrno71 :    Protocol errorerrno72 :    Multihop attemptederrno73 :    RFS specific errorerrno74 :    Bad messageerrno75 :    Value too large for defined datatypeerrno76 :    Name not unique on networkerrno77 :    File descriptor in bad stateerrno78 :    Remote address changederrno79 :    Can not access a needed sharedlibraryerrno80 :    Accessing a corrupted sharedlibraryerrno81 :    .lib section in a.out corruptederrno82 :    Attempting to link in too manyshared librarieserrno83 :    Cannot exec a shared librarydirectlyerrno84 :    Invalid or incomplete multibyte orwide charactererrno85 :    Interrupted system call should berestartederrno86 :    Streams pipe errorerrno87 :    Too many userserrno88 :    Socket operation on non-socketerrno89 :    Destinationaddress requirederrno90 :    Message too longerrno91 :    Protocol wrong type for socketerrno92 :    Protocol not availableerrno93 :    Protocol not supportederrno94 :    Socket type not supportederrno95 :    Operation not supportederrno96 :    Protocol family not supportederrno97 :    Address family not supported byprotocolerrno98 :    Address already in useerrno99 :    Cannot assign requested addresserrno100 :   Network is downerrno101 :   Network is unreachableerrno102 :   Network dropped connection onreseterrno103 :   Software caused connection aborterrno104 :   Connection reset by peererrno105 :   No buffer space availableerrno106 :   Transport endpoint is alreadyconnectederrno107 :   Transport endpoint is notconnectederrno108 :   Cannot send after transportendpoint shutdownerrno109 :   Too many references: cannot spliceerrno110 :   Connection timed outerrno111 :   Connection refusederrno112 :   Host is downerrno113 :   No route to hosterrno114 :   Operation already in progresserrno115 :   Operation now in progresserrno116 :   Stale NFS file handleerrno117 :   Structure needs cleaningerrno118 :   Not a XENIX named type fileerrno119 :   No XENIX semaphores availableerrno120 :   Is a named type fileerrno121 :   Remote I/O errorerrno122 :   Disk quota exceedederrno123 :   No medium founderrno124 :   Wrong medium typeerrno125 :   Operation cancelederrno126 :   Required key not availableerrno127 :   Key has expirederrno128 :   Key has been revokederrno129 :   Key was rejected by serviceerrno130 :   Owner diederrno131 :   State not recoverableerrno132 :   Operation not possible due toRF-killerrno133 :   Unknown error 133errno134 :   Unknown error 134errno135 :   Unknown error 135errno136 :   Unknown error 136errno137 :   Unknown error 137errno138 :   Unknown error 138errno139 :   Unknown error 139

有关权限的问题的具体解决办法可能参考此篇文章:CSDN: Android文件读写权限 fopen errno=13

默认设置是App可以访问本应用所在的目录, 例如/data/data/example.jniwritefile/,这里example.jniwritefile是应用名字。但是要访问其它存储,需要考虑到权限问题。

权限的问题的解决办法是在AndroidManifest.xml加了几个文件操作权限,并在application中加入了android:requestLegacyExternalStorage="true",文件具体如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.JNIWriteFile"android:requestLegacyExternalStorage="true"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="android.app.lib_name"android:value="" /></activity></application></manifest>

以下Java代码是在应用启动时开启弹窗让用户确认开启权限。


@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);verifyStoragePermission(this);...此处省略...}private static final int REQUEST_EXTERNAL_STORAGE = 1;private static String[] PERMISSIONS_STORAGE = {"android.permission.READ_EXTERNAL_STORAGE","android.permission.WRITE_EXTERNAL_STORAGE"};public void verifyStoragePermission(Activity activity){try{int permission = ActivityCompat.checkSelfPermission(activity,"android.permission.WRITE_EXTERNAL_STORAGE");if(permission!= PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);}}catch (Exception e){e.printStackTrace();e.printStackTrace();}}

创建文件夹

mkdir函数需要包括头文件:#include <sys/stat.h>,参考CSDN: 文件编程:创建目录mkdir()函数,具体C代码如下:

//方便用日志查看#define LOG_D(...)  __android_log_print(ANDROID_LOG_DEBUG, "jni", __VA_ARGS__)...
省略
...int errNum = 0;if(0 == access(WriteFileFolder,0)) {//目录存在} else{if(0 == mkdir(WriteFileFolder,777)) {}else {LOG_D("open fail errno = %d, reason = %s", errNum, strerror(errNum));}}
...

访问 /storage/emulated/0/

/storage/emulated/0/是可以通过Android手机文件应用/文件浏览器进行访问的。
首先,需要获取获取手机内部存储卡的根目录,Java代码获取比较方便,这里使用Android ndk来获取。
参考CSDN: Android ndk获取手机内部存储卡的根目录 和 CSDN: Android Native APP开发笔记:文件存储与访问 ,代码如下:

    //get the external file directoryjclass envcls = env->FindClass("android/os/Environment"); //获得类引用if (envcls == nullptr) return 0;//找到对应的类,该类是静态的返回值是FilejmethodID id = env->GetStaticMethodID(envcls, "getExternalStorageDirectory", "()Ljava/io/File;");//调用上述id获得的方法,返回对象即File file=Enviroment.getExternalStorageDirectory()//其实就是通过Enviroment调用 getExternalStorageDirectory()jobject fileObj = env->CallStaticObjectMethod(envcls,id);//通过上述方法返回的对象创建一个引用即File对象jclass flieClass = env->GetObjectClass(fileObj); //或得类引用//在调用File对象的getPath()方法获取该方法的ID,返回值为String 参数为空jmethodID getpathId = env->GetMethodID(flieClass, "getPath", "()Ljava/lang/String;");//调用该方法及最终获得存储卡的根目录jstring pathStr = (jstring)env->CallObjectMethod(fileObj,getpathId);const char* pathStrC = env->GetStringUTFChars(pathStr,NULL);char WriteFileFolder[100];sprintf(WriteFileFolder, "%s/DocumentTest", pathStrC);

以下代码实现了在前面创建的 /storage/emulated/0/DocumentTest目录下创建5个文件,目录是放在以上所获取的变量WriteFileFolder里的,文件名以JohnTest开头,以时间戳来命名的TXT文件,创建文件后写入This is test to write to file! Timestamp:并加上时间戳。

FILE *dumpFile = NULL;for (int j = 0; j < 5; j++) {time_t currentTime;struct tm *sCurrentTime;time(&currentTime); /*获取time_t类型当前时间*/LOG_D("Current time = %s", ctime(&currentTime));putenv("TZ=Asia/Singapore");//sCurrentTime = gmtime(&currentTime);sCurrentTime = localtime(&currentTime);char dumpfileName[100];sprintf(dumpfileName, "%s/JohnTest%04d%02d%02d%02d%02d%02d.txt",WriteFileFolder,sCurrentTime->tm_year + 1900,sCurrentTime->tm_mon + 1,sCurrentTime->tm_mday,sCurrentTime->tm_hour,sCurrentTime->tm_min,sCurrentTime->tm_sec);dumpFile = fopen(dumpfileName, "w+");char rpucData[100];sprintf(rpucData, "This is test to write to file! Timestamp: %s", ctime(&currentTime));if (dumpFile == NULL) {int errNum = 0;errNum = errno;LOG_D("open fail errno = %d, reason = %s", errNum, strerror(errNum));} else {fwrite(rpucData, sizeof(char), (unsigned) strlen(rpucData), dumpFile);fclose(dumpFile);}}

程序运行后会在相应的目录里写入5个TXT文件,并写入相应的内容。

访问/data/data/example.jniwritefile/

访问/data/data/example.jniwritefile/ 并不需要申请权限,类似以上程序,只需要进行以下修改:

...
省略
...sprintf(dumpfileName, "/data/data/example.jniwritefile/JohnTest%04d%02d%02d%02d%02d%02d.txt",sCurrentTime->tm_year + 1900,sCurrentTime->tm_mon + 1,sCurrentTime->tm_mday,sCurrentTime->tm_hour,sCurrentTime->tm_min,sCurrentTime->tm_sec);dumpFile = fopen(dumpfileName, "w+");

时间戳

有关时间戳的问题可以参考CSDN: C语言应用(1)——Unix时间戳和北京时间的相互转换 , cppreference.com: gmtime, gmtime_r, gmtime_s 和 CSDN: c++ 时间类型详解 time_t

这里使用了localtime函数,注意localtimegmtime的时差,例如新加坡/北京时间与GMT时间隔了8个小时。

        putenv("TZ=Asia/Singapore");//sCurrentTime = gmtime(&currentTime);sCurrentTime = localtime(&currentTime);

Can’t determine type for tag

参考Can’t determine type for tag macro name=“m3_comp_assist_chip_container_shape”>?attr/shapeAppearanceCornerSmall
这个问题在build.gradle(:app)里通过修改几个版本号解决,我使用了以下版本:

dependencies {implementation 'androidx.appcompat:appcompat:1.4.0'implementation 'com.google.android.material:material:1.6.0'implementation 'androidx.constraintlayout:constraintlayout:2.1.4'testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.3'androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

参考

C library function - fopen()
CSDN: android通过JNI用C/C++创建本地文件
CSDN: android studio 3.2 使用jni
CSDN Android JNI读取本地文件和读取文件并且写入其他文件
Stackoverflow: Android NDK fopen returns error 2 “No such file or directory” on a file I know exits
Stackoverlfow: Write file to location other than SDcard using Android NDK?
Stackoverlfow: File Operations in Android NDK
CSDN: Android Native APP开发笔记:文件存储与访问
Add C and C++ code to your project
Can’t determine type for tag macro name=“m3_comp_assist_chip_container_shape”>?attr/shapeAppearanceCornerSmall
CSDN: c++ 时间类型详解 time_t
cppreference.com: gmtime, gmtime_r, gmtime_s
CSDN: Android文件读写权限 fopen errno=13
CSDN: C语言应用(1)——Unix时间戳和北京时间的相互转换
CSDN: Android ndk获取手机内部存储卡的根目录
CSDN: 文件编程:创建目录mkdir()函数

相关文章:

Android JNI C++读写本地文件

文章目录小结Android JNI使用CAndroid JNI读写本地文件有关权限创建文件夹访问 /storage/emulated/0/访问/data/data/example.jniwritefile/时间戳Cant determine type for tag参考小结 进行Android JNI C读写本地文件&#xff0c;取得了想要的效果。 Android JNI使用C 对于…...

图形化深度学习开发平台PaddleStudio(代码开源)

目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战&#xf…...

【力扣-LeetCode】1138. 字母板上的路径-C++题解

1138. 字母板上的路径难度中等98收藏分享切换为英文接收动态反馈我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。在本题里&#xff0c;字母板为board ["abcde", "fghij", "klmno", "pqrst", &quo…...

基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…...

【软考系统架构设计师】2022下综合知识历年真题

【软考系统架构设计师】2022下综合知识历年真题 【2022下架构真题第01题&#xff1a;绿色】 01.云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与SaaS、PaaS、Iaas相对应&#xff0c;图中①、②、③应为( ) A.应用层、基础设施层、平台层 B.应用层、平台层、基础…...

【计组】理解Disruptor--《计算机组成原理》(十五)

Disruptor 的开发语言&#xff0c;并不是很多人心目中最容易做到性能极限的 C/C&#xff0c;而是性能受限于 JVM 的 Java。其实只要通晓硬件层面的原理&#xff0c;即使是像 Java 这样的高级语言&#xff0c;也能够把 CPU 的性能发挥到极限。 一、Padding Cache Line&#xff…...

Windows11 安装Apache24全过程

Windows11 安装Apache24全过程 一、准备工作 1、apache-httpd-2.4.55-win64-VS17.zip - 蓝奏云 2、Visual Studio Code-x64-1.45.1.exe - 蓝奏云 二、实际操作 1、将下载好的zip文件解压放到指定好的文件夹。我的是D:\App\PHP下 个人习惯把版本号带上。方便检测错误。 2…...

1302机器翻译(队列)

目录 题目描述 提示 解题思路 代码部分 题目描述 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#…...

AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

目录 4806. 首字母大写 题目描述&#xff1a; 实现代码&#xff1a; 4807. 找数字 题目描述&#xff1a; 实现代码&#xff1a; 回溯&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 4808. 构造字符串 问题…...

跟同事杠上了,Apache Beanutils为什么被禁止使用?

收录于热门专栏Java基础教程系列&#xff08;进阶篇&#xff09; 在实际的项目开发中&#xff0c;对象间赋值普遍存在&#xff0c;随着双十一、秒杀等电商过程愈加复杂&#xff0c;数据量也在不断攀升&#xff0c;效率问题&#xff0c;浮出水面。 问&#xff1a;如果是你来写…...

Golang 模糊测试的使用

一 背景 在 Go 1.18 中,Go 语言新增模糊测试(Fuzzing)。Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能…...

RSA公钥加密机制跨语言应用实战

在公钥密码学中(也称为非对称密码学)&#xff0c;加密机制依赖于两个密钥&#xff1a;公钥和私钥。公钥用于加密消息&#xff0c;而只有私钥的所有者才能解密消息。实际应用中通常需要对公钥和私钥进行序列化&#xff0c;然后分发密钥实现在不同场景、不同语言环境中使用。本文…...

P7面试送命题

面试总结&#xff0c;对标市场P7。什么叫送命题&#xff0c;一道题回答不上来面试直接挂的题目。JVM 运行时数据区域内存回收机制GC root有哪些volatile原理synchronize原理JDK 集合家族介绍HashMap原理ConcurrentHashMap原理Thread生命周期ThreadPoolExecutor生命周期、实例化…...

零信任-微软零信任介绍(2)

微软零信任是什么&#xff1f; Microsoft Zero Trust 是一种安全架构&#xff0c;旨在在没有信任任何设备、用户或网络的情况下保护网络。这种架构使用多重验证和分段技术&#xff0c;以确保每个请求和资源的安全性。 零信任不假定任何内部用户或设备是安全的&#xff…...

C++中对象调用成员函数this指针的作用

C中对象调用成员函数this指针的作用 Sales_data total;//定义对象 total.isbn();//调用对象中的成员函数isbn成员函数isbn()通过一个名为this的额外隐式参数来访问调用它的对象total。当我们调用一个成员函数时&#xff0c;用请求该函数的对象地址初始化this。 例如&#xff0…...

JavaScript------数组

目录 一、简介 1、什么是数组&#xff1f; 2、创建数组 3、数组的数据类型 4、向数组中添加元素 5、读取数组中的元素 6、实例属性&#xff1a;length 二、遍历数组 方式一&#xff1a;for循环 方式二&#xff1a;for...of 三、数组方法&#xff08;常用&#xff09…...

迷宫《1》

一天蒜头君掉进了一个迷宫里面&#xff0c;蒜头君想逃出去&#xff0c;可怜的蒜头君连迷宫是否有能逃出去的路都不知道。看在蒜头君这么可怜的份上&#xff0c;就请聪明的你告诉蒜头君是否有可以逃出去的路。输入格式第一行输入两个整数 &#xfffd;n 和 &#xfffd;m&#x…...

剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格 一个 小数 或者 整数 &#xff08;可选&#xff09;一个 ‘e’ 或 ‘…...

阻抗匹配之反射波形测量

稍微接触过高速信号的朋友&#xff0c;一定对阻抗匹配和信号反射都有所了解&#xff0c;甚至可以按照公式&#xff0c;把反射波形一路推导出来。但是&#xff0c;纸上得来终绝浅&#xff0c;绝知此事要躬行。 今天&#xff0c;我们就来实测一下信号反射波形&#xff0c;测试环…...

微信小程序 java家校通Springboot中小学家校联系电子作业系统

小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 通过对各种资料的收集&#xff0c;了解到“校讯通”是联系社会的窗口&#xff0c;是实现家校联系工作和学校…...

Fluent Python 笔记 第 8 章 对象引用、可变性和垃圾回收

本章先以一个比喻说明 Python 的变量&#xff1a;变量是标注&#xff0c;而不是盒子。如果你不知道引用式变量是什么&#xff0c;可以像这样对别人解释别名。 然后&#xff0c;本章讨论对象标识、值和别名等概念。随后&#xff0c;本章会揭露元组的一个神奇特性&#xff1a;元…...

转义字符的分类

什们是转义字符 可显示字符在字符集中&#xff0c;有一类字符具有这样的特性&#xff1a;当从键盘上输入这个字符时&#xff0c;显示器上就可以显示这个字符&#xff0c;即输入什么就显示什么。这类字符称为可显示字符&#xff0c;如a、b、c、$、和空格符等都是可显示字符。 控…...

剑指 Offer 03. 数组中重复的数字

剑指 Offer 03. 数组中重复的数字 一、题目描述&#xff1a; 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出…...

飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人

近日&#xff0c;深圳市飞速创新技术股份有限公司&#xff08;下称“飞速创新”&#xff09;预披露更新招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;飞速创新计划募资13.54亿元&#xff0c;招商证券为其保荐机构。 据介绍&#xff0c;飞速创新专…...

JUC(java.util.concurrent) 的常见类

1.ReentrantLock 可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全. ReentrantLock 也是可重入锁. "Reentrant" 这个单词的原意就是 "可重入. ReentrantLock 的用法: lock(): 加锁, 如果获取不到锁就死等.trylock(超时时间):…...

Angular4 中 ckeditor5 插件的使用

Angular4 中 ckeditor5 插件的使用 0 环境、新建项目 环境&#xff1a; Windows10Angular/cli1.4.10&#xff08;安装 Angular 的过程略过&#xff0c;Angular4 版本比较古老&#xff0c;这也导致项目安装插件及其他操作比较麻烦&#xff09; 1. ckeditor5 官方用法 基础用…...

[python刷题模板] 前缀函数/next数组/kmp算法

[python刷题模板] 前缀函数/next数组/kmp算法 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码1. 裸前缀函数2. 树上kmp3. 裸kmp三、其他四、更多例题五、参考链接一、 算法&数据结构 1. 描述 前缀函数和next数组基本上是一个东西&#…...

rust 程序设计语言入门(1)

本文是阅读《Rust程序设计语言》的学习记录&#xff0c;配合视频《Rust编程语言入门教程》食用更佳 环境搭建 windows下载rustup_init.exe&#xff0c;点击安装&#xff0c;默认选择msvc的toolchain&#xff0c;一路default即可 解决下载慢的问题&#xff0c;在powershell中修…...

基于蜣螂算法改进的LSTM预测算法-附代码

基于蜣螂算法改进的LSTM预测算法 文章目录基于蜣螂算法改进的LSTM预测算法1.数据2.LSTM模型3.基于蜣螂算法优化的LSTM4.测试结果5.Matlab代码摘要&#xff1a;为了提高LSTM数据的预测准确率&#xff0c;对LSTM中的参数利用蜣螂搜索算法进行优化。1.数据 采用正弦信号仿真数据&…...

Python安全开发——Scapy流量监控模块watchdog

目录 Python蓝队项目说明 (一)Python-蓝队项目-Scapy流量分析 0x01 Scapy参数介绍...

网站建设联系方式/自有品牌如何推广

液晶显示多功能电力仪表PD800G-B43电能监测型作为一种智能化&#xff0c;数字化的电量搜集设备&#xff0c;多功用电力表面现已被广泛的运用在各类控制系统&#xff0c;例如SCADA&#xff0c;EMS&#xff0c;BA等系统中&#xff0c;多功用电力表面是一种十分适协作为电能质量监…...

长春公司网站建设/百度seo2022新算法更新

linux安装Navicat&#xff0c;界面出现乱码解决方法 &#xff08;转发&#xff09;参考文章&#xff1a; &#xff08;1&#xff09;linux安装Navicat&#xff0c;界面出现乱码解决方法 &#xff08;转发&#xff09; &#xff08;2&#xff09;https://www.cnblogs.com/miao…...

网站做跳转付款/广州网站优化推广方案

...

衡水网站建设在哪里/网络推广合同

根据某些条件,我必须对角切割列表单元格.为此,我使用以下代码制作了对角线可绘制图像&#xff1a;对角线android:top"0dp"android:bottom"0dp">android:fromDegrees"315"android:toDegrees"315"android:pivotX"0%"androi…...

企业品牌logo设计/关键词优化公司前十排名

React中为什么要使用bind&#xff1f; 函数传参 比如在一个组件中&#xff0c;有一个点击事件&#xff0c;当点击时触发一个方法&#xff0c;onClick{ this.fun }&#xff0c;能达到我们的目的&#xff0c;触发了方法&#xff0c;执行了函数里的代码&#xff0c;但是有一个问…...

国贸做网站公司/如何制作网站

今天&#xff0c;说一Ipad充不了电&#xff0c;我想才没买好久&#xff0c;这么快电池就坏了呀。难道买到歪货了&#xff1f; 它的表现是充电线一接上去&#xff0c;电池指示有反应&#xff0c;也有"闪电"标志&#xff0c;就是充不进去电。本来想打客服的&#xff0c…...