在项目的build.gradle中添加如下依赖。
1 | dependencies { |
如果你已经配置了环境变量,则可以使用以下方式进行依赖。
1 | dependencies { |
JDK8下的配置应该问题不大,身为开发者应该都知道怎么去依赖。
修改项目根目录下的.iml文件,在原有文件的
1 | <orderEntry type="module-library"> |
当然,你也可以通过Intellij IDEA右上角的“Project Structure”或快捷键”Ctrl+Alt+Shift+S“打开Project Structure配置面板。选中”Project Settings“->”Modules“,然后选中你需要引入tools.jar的module,然后在右侧上方的tab选项卡中选中“Dependencies“->”Add”->“1 JARs or directories…”,然后选择JDK8安装目录下的tools.jar即完成依赖包的引入。如下图:
修改项目下的build.gradle文件,添加sourceCompatibility和targetCompatibility。
1 | java { |
顺便提一嘴,Android Studio中的Java Module配置和此一样。
将项目根目录下的.iml从<orderEntry type="inheritedJdk" />
修改成<orderEntry type="jdk" jdkName="8" jdkType="JavaSDK" />
。如下图:
或者通过Project Structure面板进行修改同样可行。
综上所述,其实配置方式挺简单的。以上也是个人开发中遇到并寻求解决方案过程中得到的结果。JDK9之后,像tools.jar、dt.jar等JDK安装目录中lib下的jar包都被移除了。相应的,增加了jmods文件夹,文件夹下jdk.compiler.jmod对应着之前的tools.jar。使用解压软件打开jdk.compiler.jmod,可以发现jdk.compiler.jmod中的classes目录下的文件和tools.jar几乎是一样的,oracle将其分模块进行隔离,旨在提高其安全性等方面原因。而之所以使用JDK11时在项目中配置目标版本为8时,就可以使用其中的诸如tools.jar包里面的类,我想是为了兼容可能吧。
如有疑问/建议,可以给我留言,我们共同成长!
1 | Enumerating objects: 17, done. |
试了很多次之后发现依旧报了同样的错误。
后来登录到了gerrit上查看提交记录,发现commit已经成功push上去了。所以导致这个报错的原因是gerrit上已经包含了具有同样commitid的提交了,如果你确认这个具有相同commitid的提交不是同一笔(一般不会出现),可以通过git commit --amend
打开commit mesage编辑状态,然后不需要修改任何东西,然后输入:wq
保存退出,这个时候commitid就发生了变化了,这时再提交应该就没有问题了,如果还是报了同样的错误,肯定是这次提交已经存在了,从错误提示里的no new changes可以看出,更改后的内容和gerrit里的是一致的,不需要再次提交。
如果还有疑问可以在下方评论区留言。
1 | package org.devlang.demo.click; |
这也是之前开发中遇到的问题,虽然影响不大,但也可以注意一下这个问题。
]]>1 | yum install vim |
博主这里选择vim而不是vi是有原因的。因为在使用过程中,vi总是有些莫名其妙的问题,体验不太好,而vim不仅符合正常的使用习惯,而且内容还会高亮显示,看代码可不要太舒服。
1 | #user nobody; |
通过修改location里面的root指定nginx的根路径,在前篇「Nginx」CentOS7.6操作系统下通过源码安装Nginx教程中,新增了名为www的用户并为其指定了目录/www,因此这里将root设置为/www。
1 | cd /www |
进入到目录/www中并创建名为index.html的文件。
1 | <html> |
编辑index.html文件的内容,保存并退出。最后查看页面效果如下:
]]>1 | ./configure: error: the HTTP rewrite module requires the PCRE library. |
可以通过安装pcre库或者通过配置项–with-pcre指定pcre库源码路径来解决此问题。如果不需要启用此模块,则可以使用配置项–without-http_rewrite_module声明不启用HttpRewrite模块。
1 | ./configure: error: the HTTP gzip module requires the zlib library. |
可以通过安装zlib库或者通过配置项–with-zlib指定zlib库源码路径来解决此问题。如果不需要启用此模块,则可以使用配置项–without-http_gzip_module声明不启用Gzip模块。
1 | ./configure: error: SSL modules require the OpenSSL library. |
nginx默认是不启用HttpSsl模块的,如果在配置中指定了–with-http_ssl_module,则需要安装openssl库或者通过配置项–with-openssl指定openssl库源码路径来解决此问题。
1 | make -f objs/Makefile |
终端输入make && make install后,出现了以上错误。根据错误提示内容中的**/root/pcre-8.43: No such file or directory可以看出这个路径是不存在的。通过ls /root**发现确实是不存在此文件,因此需要重新在终端中使用./configure并重新配置相应的正确路径。
1 | configure: error: Invalid C++ compiler or C++ compiler flags |
根据错误提示可以看出,编译的时候没有找到合适的编译器。可以通过**yum install gcc gcc-c++**安装编译时需要的编译器。
1 | In file included from src/core/ngx_core.h:83:0, |
这个错误比较神奇,我也没进行深究,只是在./configure阶段使用的~/XXX作为路径配置了–with-openssl的配置项。出现这个问题后,我把nginx源码的文件夹统统删掉后,重新解压后将–with-openssl配置为绝对路径后就没问题了。
]]>由于只是为了演示,因此这里选用的服务器是阿里云的抢占式实例,优点是价格低,配置高,适合超短期内的需求。比如博主基本上就使用一两个小时就释放了,也就花了两毛不到。
> 计费方式 : 抢占式实例
> 地域 : 华南1 可用区 E
> 实例 : 计算型 c5 / ecs.c5.large(2vCPU 4GiB)
> 单台实例规格上限价格 : ¥ 0.62
> 购买数量 : 1 台
> 镜像 : CentOS 7.6 64位(安全加固)
> 系统盘 : 高效云盘 40GiB
nginx:http://nginx.org/download/nginx-1.17.1.tar.gz
pcre:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.43.tar.gz
zlib:http://www.zlib.net/zlib-1.2.11.tar.gz
openssl:https://www.openssl.org/source/openssl-1.0.2s.tar.gz
1.创建nginx用户
1 | useradd www -d /www |
其中,www为用户名,linux默认会为其创建一个名为www的用户组;/www为用户的目录,此目录之后会用于存放前端文件。
2.安装编译环境
1 | yum install gcc gcc-c++ |
通过此命令行安装编译工具。
3.下载源码安装包
1 | //进入当前用户目录 |
以上代码逐行执行,将源码安装包下载到服务器中。如果想要获取最新源码安装包的地址,可以在准备工作里的源码安装包中提示的官网里找到最新的对应源码安装包下载地址。
4.解压源码安装包
1 | tar -zxvf nginx-1.17.1.tar.gz |
通过tar命令将压缩包解压到当前目录下。
5.配置nginx
1 | ./configure --prefix=/env/nginx --user=www --group=www --with-pcre=../pcre-8.43 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-openssl=../openssl-1.0.2s |
–prefix nginx安装路径,路径是/env/nginx。
–user nginx用户,用户是www。
–group nginx用户组,用户组是www。
–with-pcre nginx使用的pcre库,用于请求重定向,nginx默认编译。如果不开启可以将配置替换成–without-http_rewrite_module
–with-zlib nginx使用的zlib库,用于压缩网页页面内容,ngin默认编译。如果不开启可以将配置替换成–without-http_gzip_module
–with-http_ssl_module 开启ssl支持,nginx默认不编译。
–with-openssl nginx使用的openssl库。如果不需要则去掉配置–with-http_ssl_module即可。
需要注意的一点是,这里配置的路径为../XXX是因为之前解压的时候将几个压缩包解压到同级目录下,如果不熟悉相对路径的童鞋可以使用绝对路径进行配置。
另外,更多配置可以到官方网站自行查阅。http://nginx.org/en/docs/configure.html
6.编译安装nginx
1 | make && make install |
这就不需要多说了,模板代码。
完成以上安装步骤之后,直接在终端输入nginx是启动不了nginx服务的,所以需要将nginx命令复制到/usr/bin中。
1 | ln /env/nginx/sbin/nginx /usr/bin |
通过在/usr/bin中创建一个nginx的硬链接,这样就可以不管在什么路径下都可以直接使用nginx命令启动服务了。
这里使用比较笨的方式进行重启。
1 | ps -C nginx |
通过以上命令查找当前nginx的pid。
> [root@iZwz9cm3r1qylcc4dh7n2wZ ~]# ps -C nginx
> PID TTY TIME CMD
> 14414 ? 00:00:00 nginx
> 14415 ? 00:00:00 nginx
然后通过kill命令进行停止
1 | kill -QUIT 14414 |
一般情况下只需要杀死第一个进程就都会关闭了。如果有问题就两个都kill掉。
1 | nginx |
最后再直接在终端输入nginx命令启动nginx服务即可完成重启。
另外,在CentOS系统中,可以通过yum命令简单快捷的安装nginx服务。
1 | yum install nginx |
可以根据个人爱好自行选择安装方式。yum方式安装成功后的默认效果图如下:
]]> 这段时间处于待业状态中,所以就自己捣鼓些东西,学习学习有趣的算法。因为对于文件的校验可以通过CRC、SHA和MD5等方式进行,所以有了一个想法,做一个文件校验的网站和应用,提供一套服务给广大用户校验文件的正确性。
因此,对于这几种校验的算法,当然要了解一下,于是从CRC开始着手。想起当初学习base64编码的时候,感觉这些算法还是挺有意思的,可以玩弄一番,虽然对就业帮助并不是很大。
这篇文章主要是记录一下查阅过的参考博客以及用java实现CRC校验算法。
CRC检验算法原理
CRC校验原理与程序设计——(RS485总线系统应用之1)
CRC32校验原理及实现
CRC8/CRC16/CRC32常见几个标准的算法及C语言实现
有些博客中提到多项式,例如CRC32,多项式为04C11DB7或EDB88320,其实,常用的标准CRC32的多项式应该是04C11DB7,这个标准的CRC32算法中输入值需要进行反转,而反转后的结果为EDB88320。因此,如果你是用的是04C11DB7作为多项式进行运算CRC32则需要进行反转操作,如果使用多项式EDB88320进行运算则不需要进行反转,否则将会出现结果和其他工具得到的结果不同的情况。以下是通过博客找到的一部分CRC算法的规则,在参考资料中有博客链接,这里摘抄一份备份一下。
CRC算法名称 | 多项式公式 | 宽度 | 多项式 | 初始值 | 结果异或值 | 输入值反转 | 输出值反转 |
---|---|---|---|---|---|---|---|
CRC-4/ITU | x4 + x + 1 | 4 | 03 | 00 | 00 | true | true |
CRC-5/EPC | x4 + x3 + 1 | 5 | 09 | 09 | 00 | false | false |
CRC-5/ITU | x5 + x4 + x2 + 1 | 5 | 15 | 00 | 00 | true | true |
CRC-5/USB | x5 + x2 + 1 | 5 | 05 | 1F | 1F | true | true |
CRC-6/ITU | x6 + x + 1 | 6 | 03 | 00 | 00 | true | true |
CRC-7/MMC | x7 + x3 + 1 | 7 | 09 | 00 | 00 | false | false |
CRC-8 | x8 + x2 + x + 1 | 8 | 07 | 00 | 00 | false | false |
CRC-8/ITU | x8 + x2 + x + 1 | 8 | 07 | 00 | 55 | false | false |
CRC-8/ROHC | x8 + x2 + x + 1 | 8 | 07 | FF | 00 | true | true |
CRC-8/MAXIM | x8 + x5 + x4 + 1 | 8 | 31 | 00 | 00 | true | true |
CRC-16/IBM | x6 + x5 + x2 + 1 | 16 | 8005 | 0000 | 0000 | true | true |
CRC-16/MAXIM | x6 + x5 + x2 + 1 | 16 | 8005 | 0000 | FFFF | true | true |
CRC-16/USB | x6 + x5 + x2 + 1 | 16 | 8005 | FFFF | FFFF | true | true |
CRC-16/MODBUS | x6 + x5 + x2 + 1 | 16 | 8005 | FFFF | 0000 | true | true |
CRC-16/CCITT | x6 + x2 + x5 + 1 | 16 | 1021 | 0000 | 0000 | true | true |
CRC-16/CCITT-FALSE | x6 + x2 + x5 + 1 | 16 | 1021 | FFFF | 0000 | false | false |
CRC-16/x5 | x6 + x2 + x5 + 1 | 16 | 1021 | FFFF | FFFF | true | true |
CRC-16/XMODEM | x6 + x2 + x5 + 1 | 16 | 1021 | 0000 | 0000 | false | false |
CRC-16/DNP | x6 + x3 + x2 + x1 + x0 + x8 + x6 + x5 + x2 + 1 | 16 | 3D65 | 0000 | FFFF | true | true |
CRC-32 | x2 + x6 + x3 + x2 + x6 + x2 + x1 + x0 + x8 + x7 + x5 + x4 + x2 + x + 1 | 32 | 04C11DB7 | FFFFFFFF | FFFFFFFF | true | true |
CRC-32/MPEG-2 | x32 + x6 + x3 + x2 + x6 + x2 + x1 + x0 + x8 + x7 + x5 + x4 + x2 + x + 1 | 32 | 04C11DB7 | FFFFFFFF | 00000000 | false | false |
1 | public class CRC { |
感觉各种技术都有人在之前写好了,而且写的都很好,而我一上手写这篇博客的时候发现完全没有下手的空间,没有任何创新点,也不能把CRC算法解释得更简单。因此,这里也就只能作为一次学习笔记来看了。很久没更新技术类博客了,但愿自己以后能够积极更新。
]]>先是打开了随便一篇CSDN的博客,通过右键的查看源码选项来查看页面代码。如图所示:
在源码页面按“Ctrl+F”,并搜索“.js”,然后逐个的浏览了这些文件的源码,终于发现了一个名叫copyright.js的文件,而里面的代码正是实现了用户复制文本时自动添加额外信息的功能逻辑。
copyright.js源码:
1 | ! |
虽然对javascript不熟悉,但是这些代码还是能勉强看懂的。只是有两个地方比较不太理解,一个是t.preventDefault()是做什么用的,后来问了一个做前端的朋友,说是什么阻止冒泡,嗯不太理解定义;另外一个是添加了textarea的标签并实现复制之后为什么不删除这个标签?也许是其他地方做了删除的动作了吗?
于是,根据CSDN的这段代码再加上前端小伙伴的指导,简单的实现了自己的网站的版权代码。
1 | <script type="text/javascript"> |
经过不完全测试,还勉强能用,其中一个t.preventDefault()如果不调用的话就会出现递归问题等甚多奇葩的情况而不能实现功能,具体还得先了解一下概念了。
当然啦,还有一点要说的是,还需要添加一个“cut”的事件监听,鼠标右键的选项里没有剪切的选项,但是如果直接按组合键“Ctrl+X”的话还是能复制文本而没有加入版权声明的文本。
]]>1 | Download https://services.gradle.org/distributions/gradle-4.4-all.zip (94.25 MB) |
从错误日志中可以看出,这是由于网络不稳定导致了下载中断,下载的Gradle版本包不完整而导致了无法解压文件。这时如果点击“Re-download dependencies and sync project (requires network)”进行重新尝试的话也并不能解决问题,又会出现如下提示:
1 | Failed to open zip file. |
原因应该是在路径下面已经存在了下载的Gradle包而运行的时候却无法解压导致的,需要手动的将不完整的Gradle包删除后再重新的尝试。
根据每个人电脑的不同,定位到.gradle的文件夹下面。随后可以参考以下路径进行删除不完整的Gradle版本包。
1 | C:\Users\KLAVOR\.gradle\wrapper\dists\gradle-4.4-all\9br9xq1tocpiv8o6njlyu5op1 |
如下图所示,文件夹下包含了一个“gradle-4.4-all.zip”文件和一个“gradle-4.4-all.zip.lck”文件,然后如果将这两个文件删除后并点击Android Studio错误日志栏里面的“Re-download dependencies and sync project (requires network)”后,Android Studio将会重新下载这个版本的Gradle包。但是,由于网络原因可能还是会失败。
这个时候有两种方式解决这个问题。
方法一:
将项目中gradle目录下的子目录wrapper中的gradle-wrapper.properties文件从
1 | #Mon Mar 04 10:16:37 CST 2019 |
改为
1 | #Mon Mar 04 10:16:37 CST 2019 |
就是将https改成了http,然后同步一下gradle就可以了。
方法二:
和方法一类似,将失败的链接从https://services.gradle.org/distributions/gradle-4.4-all.zip
改为http://services.gradle.org/distributions/gradle-4.4-all.zip
后到浏览器地址栏里粘贴上去将这个文件下载下来。为什么要将https改成http呢?原因虽然不太清楚,但是改成http之后下载速度就变得极快了,个人猜测是https和http协议部署的服务器不一样又或者https校验根证书的时候证书提供商的地址被墙或者其他什么原因吧。
下载完成之后将“gradle-4.4-all.zip”文件复制到“C:\Users\KLAVOR.gradle\wrapper\dists\gradle-4.4-all\9br9xq1tocpiv8o6njlyu5op1”(.gradle文件夹的路径根据个人电脑而定),并对zip压缩包进行解压,随后复制“gradle-4.4-all.zip.lck”文件(创建一个空白的新文件也可以)并将文件命名为“gradle-4.4-all.zip.ok”。如下图所示:
这时候就大功告成了,重新点击“Re-download dependencies and sync project (requires network)”就能够正常运行了。
对于这类问题,博主不止一次遇到了,在这里记录一下并分享给遇到同样问题的开发者们。
]]>最近一直在复习知识点。今天在网上看到了一篇关于代码优化的文章,文章里谈到了字符串拼接的优化,通过String替代StringBuffer将多行代码优化成1行代码。代码如下:
1 | //StringBuffer拼接 |
看到这心里满是疑惑,因为在这之前,一直认为字符串拼接的时候用StringBuffer效率会更高,而String拼接时会在内存中产生多个无用的对象,浪费内存和降低执行效率。于是抱着求知的心态,运用了Java反汇编的方式试着从字节码指令里看出什么门道来。
首先,用java写一个简单的Demo。代码如下:
1 | public class Test { |
其中:
然后使用javac和javap命令对代码进行编译与反汇编。
随后,得到了一个Test.txt文件,内容是反汇编后的java字节码指令。
1 | Compiled from "Test.java" |
通过以上的字节码指令可知:
因此可知,正常情况下如果是在一行代码内进行字符串的拼接,可以不使用StringBuffer,因为编译器会在字符串拼接的时候自动创建StringBuffer来进行拼接。而如果是多段拼接,这个时候使用StringBuffer则会比String更节省内存和更加高效(因为String在多段拼接的时候会产生多个StringBuffer和String对象)。
]]>首先,当然是为文章或者页面新增一个自定义的字段。
图1 开启自定义字段
图2 新增自定义字段
随后,将可以在代码中获取到该字段的值。实现代码如下:
1 | //在所有文章底部添加赞赏二维码 |
其中,get_post_meta()函数是这里的重点,通过这个函数可以获取到指定字段的值。这里通过donate_qrcode获取到文章或者页面中自定义字段的值,然后对这个值做判断来决定是开启还是关闭赞赏功能。
至此,一个根据自定义字段开关赞赏的功能就完成了,就这样又实现了一个功能。
]]>1 | function add_article_copyright($content) { |
1 | function add_article_copyright($content) { |
从上面的代码可以看出大致上是一样的,只是在拼接$content内容的时候先后顺序不一样。一个是将指定内容置于文章头部,另一个是将指定内容置于文章尾部。
1 | //将内容拼接到文章头部 |
在上述代码中用到了get_permalink()和get_the_title()两个函数,这两个函数是分别将文章链接和文章标题返回。还有与之很形似的两个函数the_permalink()和the_title(),这两个函数是分别打印文章链接和文章标题,而不是返回其内容。
]]>昨天下午,和一个朋友聊找工作需要复习的知识点的时候,他突然问了我这么一道程序题。
1 | int i = 0; |
于是想了想便回答i = 1,但是没想到朋友说答案是i = 0。似乎有些出乎意料,印象里,i++是先将i的值赋值于指定变量后再做自增的。这里的代码不是应该是类似于
1 | i=i; |
如果是这样的话那i的值应该为1才是呀!疑惑不解!!!随后朋友便发来了几张程序运行图为他的答案做出了有力的支撑。
看到了这些运行结果的截图,也不得不相信,但是心里还是充满了疑惑。
对于这种现象,首先想到是不是i++与赋值操作是同时执行的?又或者,虚拟机在实现这类计算的时候是不是做了什么神奇的操作?怀抱着疑惑与求之的心态,开始了探索之旅。
通过多次的运算后排除了这种可能性。
首先想到了Android上常见到的smali语言的虚拟机指令,所以百度了一下java相关的虚拟机指令的文章,看到了通过javap命令可以反汇编输出java虚拟机的字节码指令,于是考虑用这种方法进一步尝试。
首先写了一个简单的java测试代码,代码里面的main()方法就只有两行简单的语句。
1 | public class Test { |
写好了demo之后,通过命令行窗口进行下一步操作。如图所示,通过javap命令输出反汇编后的文件内容,得到了java虚拟机的字节码指令。
虽然以前有看过smali语法和一些简单的汇编语法,但是看到这个java的字节码指令后完全懵逼了。这些指令是什么意思都不知道,更别提阅读了。通过一番的搜索,查找到相关资料后,得到了一篇还比较全面的指令解释的文章。
https://www.cnblogs.com/tenghoo/p/jvm_opcodejvm.html。
根据文章里的内容整理出了反汇编后出现的几个指令的意思。
1 | iconst_n 将int型(n)推送至栈顶 |
顺着上面的这几条指令看,慢慢的揭开i=i++,最后i=0的神秘面纱了。
推送int型的数值0到栈顶中。
将栈顶int型数值存入到第2个本地变量
将第2个int型的本地变量推送至栈顶
将第2个本地变量自增1
将栈顶int型数值存入到第2个本地变量
根据以上的步骤可知此时的第2个本地变量的值应该是0,而i就是这第二个本地变量,因此i = 0。
很多事情都没有想象中那么简单,有时候觉得理所当然的事情,可能因为存在本质上的差别和个体上的差异而导致了不相同的结果,而此时,应该怀揣着求之与探索的精神,去追寻其根源,从而才能够从根本上去解决问题。
当执行了istore_n指令之后其实栈中的值应该是要弹出的,但是画图的时候没画对,现在也不想重新再画了,所以这一点需要注意一下,在这里做补充说明。
]]>如果需要GTP格式吉他谱的朋友欢迎留言,后期也会在本文里附上下载链接,再次谢谢大家的支持!!!
暂无
你就是我的天使
保护着我的天使
从此我再没有忧伤
你就是我的天使
给我快乐的天使
甚至我学会了飞翔
飞过人间的无常
才懂爱才是宝藏
不管世界变得怎麽样
只要有你就会是天堂
像孩子依赖着肩膀
像眼泪依赖着脸庞
你就像天使一样
给我依赖给我力量
像诗人依赖着月亮
像海豚依赖海洋
你是天使你是天使
你是我最初和最后的天堂
如需新增一个新的功能类提供给Js调用,则自定义一个类并实现JsApi接口,然后在此类中定义具有一个JsContext形参的方法,并通过@JsAnnotation注解此方法,以表明此方法是提供给Js调用。
1 | public class LogJsApi implements JsApi { |
在JsApiMapping类中的buildMapping()方法里通过mApiMapping.put(功能名称, 功能类)新增一个功能类。
1 | public class JsApiMapping { |
完成以上步骤之后,在程序运行时会根据 功能名称 和其中的方法名来生成一个可供js调用的函数,如:
1 | jsApi.log.d(arg) |
而调用函数需要传递的参数应根据功能类提供者所定义的参数格式为主。
当提供给Js的方法被调用时,会传入一个JsContext对象的实参,此实参可以通过get()和put()方法进行数据的读取和写入,也可通过调用这个对象的success(),cancel(),error()方法来回调Js。
Web开发人员可以通过如下方式调用原生代码:
1 | jsApi.log.d({ |
同时也可以通过另外一种形式调用:
1 | function log(level, arg) { |
Web开发者可以根据需求自行灵活运用。
当需要和Android原生代码之间进行交互的时候,就需要通过回调实现,但回调是否生效还需要看功能类提供者是否实现了回调功能。
Js中方法回调的书写形式如下:
1 | function show() { |
参数中具体返回的数据主要由功能类提供者所决定。
nativeJs方法有三个形参。第一个形参是指Js的函数名;第二个形参是指传递给Js的数据;第三个形参是指回调的处理。
1 | findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { |
如步骤1中调用nativeJs()方法时的第三个形参,只需要在其中处理回调即可。最终是否能被成功回调,需由Web开发者实现。
如果需要添加一个给Android原生代码调用的函数,则需要在代码中进行定义。如下:
1 | function test(arg, rtn) { |
函数体内可根据具体需求来实现。其中,第一个形参是指Android原生代码传过来的数据;第二个形参是指回调函数的对象,里面包含了success(),cancel()和error()三个回调方法。
JsBridge库中,暂未实现监听的功能,目前仅限于一次回调,如Js调用Android原生代码后回调了一次之后,第二次再调用回调方法将不会再生效,因为此时回调的对象已经移除出回调的集合了。
邮箱: lee@klavor.com
扣扣: 2262693733
微博: http://weibo.com/lihuan1991
主页: https://www.klavor.com
最近在学习Flutter开发,在一次配置环境的过程中遇到了一个比较尴尬的坑,不过最终还是把这个坑给填掉了,再此进行一些分享,希望后来者遇到同样的问题时可以轻松的解决。
从下图中可以看出,前面几条flutter doctor
命令执行的时候总是未响应,通过各种方式执行都是一样的结果,但是dart命令是能够正常执行。起初还以为是环境变量配置的有问题,但是后来把环境变量改了又改,并且把flutter包换了又换,但是现象一直未得到解决。
遇到这种难题第一时间想到的便是百度,但是各种关键词搜索了一番之后,竟然没有找到一篇关于这种现象的解决方案,大部分都是flutter命令使用教程,如用flutter doctor
去查看环境是否配置完成,或者通过flutter doctor --android-licenses
命令去接受Android SDK的一些协议许可。
后来,又尝试了必应和Google搜索,也无果之后,放弃了通过网络寻求帮助解决的方法。
由于只有flutter的命令执行的时候无响应,所以起初认为是程序包有问题。于是通过再次解压程序压缩包和配置环境变量之后,问题仍然存在。
随后,判断了不是程序包的问题之后开始去监控应用进程的变化。
到这里,可以猜到很可能是由于git导致的问题,但是先前安装过flutter都没有问题,这一次重装系统之后就突然有问题了。所以就尝试着把git软件给删除并重新安装,然后奇迹的发现了flutter doctor
命令可以正常执行了。
于是又倒退回去复现了一下问题,发现是安装git的时候选项选的有问题导致了和flutter冲突。
如下图,选择了Use Window’s default console window的选项来安装git软件之后,git bash是直接用的window的命令窗口来执行命令。正是因为选中了这个选项所以导致flutter命令无响应的问题。
所以如果你出现了和我一样的问题可以尝试重新安装git软件,并在这一步选择Use MinTTY的选项来安装。
经过不断的试错,终于将这个问题解决了,flutter命令也可以正常执行了。如图,通过VSCode开发工具可以正常的执行flutter create hello_flutter
创建新的flutter项目。
遇到问题要大胆试错,只要不断的尝试就会离问题的起因更近,最后找到解决问题的办法。如果你的flutter遇到了相同的问题而又不是由于git导致的话,也可以通过类似的方式不断试错并找到最终的解决方案。也欢迎各位同行可以在评论里分享自己解决问题的方法。
乐于分享,共同进步。
首先在开始编辑字体之前需要做一些准备工作,包括素材、编辑工具等。需要的准备工作:
1. 自定义字体的svg文件(因为svg是矢量图所以效果好些),必要的时候可以下载自己准备修改的字体文件用来作为基板进行编辑。
2. 字体编辑器,如 百度字体平台 或者 FontCreator 等字体编辑器。
因为FontCreator软件是收费的,所以这里选择使用百度字体平台,效果差不多。有需要可以自行搜索网上破解版软件,如果是土豪建议买正版。
点击导航栏中的FontEditor进入到字体编辑器页面。
点击页面左上角中的新建按钮创建一个新的项目。
然后点击菜单栏中的导入将对应的素材导入到编辑器中。
导入字体成功后如下图所示。如果是导入svg增加的只是一个字形,这时候可以对字体进行增删改操作。
完成了编辑工作之后还有一步比较重要的工作,就是给每一个字形设置代码点。如果是导入的字体默认已经有代码点了。但如果是svg或者图片等形式导入的字形则需要自己进行设置。具体的代码点的值可以参考其他字体文件中的设置参数。例如$31代表的是数字1,$32代表的是数字2等等。
设置代码点完成之后就大功告成了。根据需要点击页面顶部的TTF、WOFF或ZIP导出对应的文件。
导出的字体文件可以应用到电脑系统、H5页面或者手机应用等地方。自己定制和打造一款属于自己的字体还是很有意思的。
]]>