-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
741 lines (516 loc) · 46.5 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.1.1">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">
<script id="hexo-configurations">
var NexT = window.NexT || {};
var CONFIG = {"hostname":"yoursite.com","root":"/","scheme":"Muse","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}}};
</script>
<meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="http://yoursite.com/">
<script id="page-configurations">
// https://hexo.io/docs/variables.html
CONFIG.page = {
sidebar: "",
isHome : true,
isPost : false,
lang : 'en'
};
</script>
<title>Hexo</title>
<noscript>
<style>
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-header { opacity: initial; }
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage">
<div class="container use-motion">
<div class="headband"></div>
<header class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="Toggle navigation bar">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<h1 class="site-title">Hexo</h1>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger">
</div>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="main-menu menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section"><i class="fa fa-home fa-fw"></i>Home</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>Archives</a>
</li>
</ul>
</nav>
</div>
</header>
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
<span>0%</span>
</div>
<main class="main">
<div class="main-inner">
<div class="content-wrap">
<div class="content index posts-expand">
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2020/09/14/https%E8%AF%A6%E8%A7%A3/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="John Doe">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2020/09/14/https%E8%AF%A6%E8%A7%A3/" class="post-title-link" itemprop="url">HTTPS讲解</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2020-09-14 17:16:33" itemprop="dateCreated datePublished" datetime="2020-09-14T17:16:33+08:00">2020-09-14</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-09-16 22:47:55" itemprop="dateModified" datetime="2020-09-16T22:47:55+08:00">2020-09-16</time>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<blockquote>
<h3 id="1-HTTP-的最大弊端——不安全"><a href="#1-HTTP-的最大弊端——不安全" class="headerlink" title="1. HTTP 的最大弊端——不安全"></a>1. HTTP 的最大弊端——不安全</h3><p> 至于为什么不安全,看了下面这张图就一目了然了。<br><img src="/images/http%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%E8%BF%87%E7%A8%8B.png" alt="http数据传输过程.png"><br>由图可见,HTTP 在传输数据的过程中,所有的数据都是明文传输,自然没有安全性可言,特别是一些敏感数据,比如用户密码和信用卡信息等,一旦被第三方获取,可能就会产生很严重的后果。</p>
</blockquote>
<blockquote>
<h3 id="2-加密算法简单介绍"><a href="#2-加密算法简单介绍" class="headerlink" title="2. 加密算法简单介绍"></a>2. 加密算法简单介绍</h3><p>HTTPS 解决数据传输安全问题的方案就是使用加密算法,具体来说是混合加密算法,也就是对称加密和非对称加密的混合使用,这里有必要先了解一下这两种加密算法的区别和优缺点。<br>####2.1 对称加密<br>对称加密,采用这种加密方法的双方加密和解密都是使用同一个密钥,常见的对称加密算法有 DES、3DES 和 AES 等,其优缺点如下:</p>
<ul>
<li>优点:算法公开、计算量小、加密速度快、加密效率高,适合加密比较大的数据。</li>
<li>缺点:</li>
</ul>
<p>1.交易双方需要使用相同的密钥,也就无法避免密钥的传输,而密钥在传输过程中无法保证不被截获,因此对称加密的安全性得不到保证。<br>2.每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一密钥,这会使得发收信双方所拥有的钥匙数量急剧增长,<a target="_blank" rel="noopener" href="http://baike.baidu.com/view/297229.htm">密钥管理</a>成为双方的负担。<br><img src="/images/%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%E8%BF%87%E7%A8%8B.png" alt="对称加密数据传输过程.png"><br>从图中可以看出,被加密的数据在传输过程中是无规则的乱码,即便被第三方截获,在没有密钥的情况下也无法解密数据,也就保证了数据的安全。但是有一个致命的问题,那就是既然双方要使用相同的密钥,那就必然要在传输数据之前先由一方把密钥传给另一方,那么在此过程中密钥就很有可能被截获,这样一来加密的数据也会被轻松解密。那如何确保密钥在传输过程中的安全呢?这就要用到非对称加密了。<br>####2.2 非对称加密<br>非对称加密,加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公钥对外公开;得到该公钥的乙方使用公钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的私钥对加密后的信息进行解密。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。常用的非对称加密算法是 RSA 算法,其优缺点如下:</p>
<ul>
<li>优点:算法公开,加密和解密使用不同的钥匙,私钥不需要通过网络进行传输,安全性很高。</li>
<li>缺点:计算量比较大,加密和解密速度相比对称加密慢很多。<br><img src="/images/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86%E5%8F%91%E9%80%81key%E7%9A%84%E8%BF%87%E7%A8%8B.png" alt="非对称加密发送key的过程.png"><br>在上述过程中,客户端在拿到服务器的公钥后,会生成一个随机码 (用 KEY 表示,这个 KEY 就是后续双方用于对称加密的密钥),然后客户端使用公钥把 KEY 加密后再发送给服务器,服务器使用私钥将其解密,这样双方就有了同一个密钥 KEY,然后双方再使用 KEY 进行对称加密交互数据。在非对称加密传输 KEY 的过程中,即便第三方获取了公钥和加密后的 KEY,在没有私钥的情况下也无法破解 KEY (私钥存在服务器,泄露风险极小),也就保证了接下来对称加密的数据安全。而上面这个流程图正是 HTTPS 的雏形,HTTPS 正好综合了这两种加密算法的优点,不仅保证了通信安全,还保证了数据传输效率。</li>
</ul>
</blockquote>
<blockquote>
<p>##3. 维基百科对https的定义<br><img src="/images/https%E5%AE%9A%E4%B9%89.png" alt="https定义.png"><br>也就是说 HTTPS = HTTP + SSL / TLS。<br>接下来就是最重要的 HTTPS 原理解析了<br><img src="/images/HTTPS%E5%8A%A0%E5%AF%86%E3%80%81%E8%A7%A3%E5%AF%86%E3%80%81%E9%AA%8C%E8%AF%81%E5%8F%8A%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93%E8%BF%87%E7%A8%8B.png" alt="HTTPS加密、解密、验证及数据传输过程.png"><br>如上图所示,HTTPS 的整个通信过程可以分为两大阶段:证书验证和数据传输阶段,数据传输阶段又可以分为非对称加密和对称加密两个阶段。具体流程按图中的序号讲解。</p>
<ol>
<li>客户端请求 HTTPS 网址,然后连接到 server 的 443 端口 (HTTPS 默认端口,类似于 HTTP 的80端口)。</li>
<li>采用 HTTPS 协议的服务器必须要有一套数字 CA (Certification Authority)证书,证书是需要申请的,并由专门的数字证书认证机构(CA)通过非常严格的审核之后颁发的电子证书 (当然了是要钱的,安全级别越高价格越贵)。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被篡改。</li>
<li>服务器响应客户端请求,将证书传递给客户端,证书包含公钥和大量其他信息,比如证书颁发机构信息,公司信息和证书有效期等。Chrome 浏览器点击地址栏的锁标志再点击证书就可以看到证书详细信息。<br><img src="https://upload-images.jianshu.io/upload_images/2362212-af03ccd5c312a25c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="B站CA证书.png"></li>
<li>客户端解析证书并对其进行验证。如果证书不是可信机构颁布,或者证书中的域名与实际域名不一致,或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。就像下面这样:<br><img src="/images/%E6%B5%8F%E8%A7%88%E5%99%A8%E5%AE%89%E5%85%A8%E8%AD%A6%E5%91%8A.png" alt="浏览器安全警告.png"><br>如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥A。然后客户端还会生成一个随机码 KEY,并使用公钥A将其加密。</li>
<li>客户端把加密后的随机码 KEY 发送给服务器,作为后面对称加密的密钥。</li>
<li>服务器在收到随机码 KEY 之后会使用私钥B将其解密。经过以上这些步骤,客户端和服务器终于建立了安全连接,完美解决了对称加密的密钥泄露问题,接下来就可以用对称加密愉快地进行通信了。</li>
<li>服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。</li>
<li>双方使用对称加密愉快地传输所有数据。</li>
</ol>
</blockquote>
<h3 id="4、总结"><a href="#4、总结" class="headerlink" title="4、总结"></a>4、总结</h3><ul>
<li><p>HTTP 明文传输,不对数据进行加密安全性较差,HTTPS (HTTP + SSL / TLS)的数据传输过程是加密的,安全性较好;</p>
</li>
<li><p>使用HTTPS协议需要申请CA证书;</p>
</li>
<li><p>由于HTTPS是构建在SSL/TLS之上的HTTP协议,所以无论是响应时间还是耗电量上都有大幅度的上升;</p>
</li>
<li><p>HTTPS 的安全是有范围的,在黑客攻击、服务器劫持等情况下几乎起不到作用。</p>
</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2016/08/16/Jni%E7%9A%84%E4%BD%BF%E7%94%A8/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="John Doe">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2016/08/16/Jni%E7%9A%84%E4%BD%BF%E7%94%A8/" class="post-title-link" itemprop="url">Jni的使用</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2016-08-16 20:41:36" itemprop="dateCreated datePublished" datetime="2016-08-16T20:41:36+08:00">2016-08-16</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-09-14 21:20:00" itemprop="dateModified" datetime="2020-09-14T21:20:00+08:00">2020-09-14</time>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="相关知识简介"><a href="#相关知识简介" class="headerlink" title="相关知识简介"></a>相关知识简介</h1><h2 id="交叉编译"><a href="#交叉编译" class="headerlink" title="交叉编译"></a>交叉编译</h2><p>在一个平台下,编译出另一个平台能够执行的二进制的代码。</p>
<h2 id="处理器类型"><a href="#处理器类型" class="headerlink" title="处理器类型"></a>处理器类型</h2><ul>
<li>x86</li>
<li>arm</li>
<li>mips</li>
</ul>
<h2 id="交叉编译的原理"><a href="#交叉编译的原理" class="headerlink" title="交叉编译的原理"></a>交叉编译的原理</h2><p>源代码-》编译-》链接-》可执行程序,模拟其他平台的特性</p>
<h2 id="交叉编译的工具链"><a href="#交叉编译的工具链" class="headerlink" title="交叉编译的工具链"></a>交叉编译的工具链</h2><p>多个工具的集合,一个工具使用完后接着调用下一个工具</p>
<h2 id="常见工具"><a href="#常见工具" class="headerlink" title="常见工具"></a>常见工具</h2><ul>
<li>NDK:native development kit 开发jni必备,就是模拟其他平台特性来编译代码的工具</li>
<li>CDT:c/c++ development tools 高亮显示c语言关键字</li>
<li>cygwin:一个模拟器,可以在windows下运行Linux指令</li>
</ul>
<h2 id="NDK目录结构"><a href="#NDK目录结构" class="headerlink" title="NDK目录结构"></a>NDK目录结构</h2><ul>
<li>doc 帮助文档</li>
<li>build/tools linux的批处理文件</li>
<li>platforms:编译c代码需要使用的头文件和类库</li>
<li>prebuilt:预编译使用的二进制可执行文件</li>
<li>sample:用例</li>
<li>source:源码</li>
<li>toolchains:工具链</li>
<li>ndk-build.cmd:编译打包c代码的一个指令</li>
</ul>
<h2 id="使用Jni-java代码调用c-c"><a href="#使用Jni-java代码调用c-c" class="headerlink" title="使用Jni (java代码调用c/c++)"></a>使用Jni (java代码调用c/c++)</h2><ol>
<li>在java项目根目录下创建jni文件夹</li>
<li>在jni文件夹中创建一个c文件</li>
<li>在java代码中创建一个本地方法helloFromC<br><code>public native String helloFromC();</code></li>
<li>在jni中定义函数实现这个方法,函数名必须为<br><code>jstring Java_包名_类名_方法名(JNIEnv* env,jobject obi)</code></li>
<li>返回一个字符串,用c定义一个字符串<br><code>char* cstr = "hello from c";</code></li>
<li>把c的字符串转换成java的字符串<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">jstring jstr = (*env)->NewStringUTF(env,cstr);</span><br><span class="line"><span class="keyword">return</span> jstr;</span><br></pre></td></tr></table></figure></li>
<li>在jni中创建Android.mk文件</li>
<li>在c文件中添加头文件</li>
<li>在jni文件夹下执行ndk-build.cmd指令</li>
</ol>
<p>Android.mk文件中包含的内容如下:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">LOCAL_PATH :=$(call my-dir)</span><br><span class="line"></span><br><span class="line"> include $(CLEAR_VARS)</span><br><span class="line"> #编译生成的文件的类库名</span><br><span class="line"> LOCAL_MODULE :=hello</span><br><span class="line"> #要编译的c文件</span><br><span class="line"> LOCAL_SRC_FILES :=Hello.c</span><br><span class="line"> include $(BUILD_SHARED_LIBRARY)</span><br></pre></td></tr></table></figure>
<p>在java代码中加载so类库的方法如下:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">static</span>{</span><br><span class="line"> <span class="comment">//加载打包完毕的so类库</span></span><br><span class="line"> System.loadLibrary(<span class="string">"hello"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="常见错误"><a href="#常见错误" class="headerlink" title="常见错误"></a>常见错误</h2><p>1、findLibrary return null</p>
<ul>
<li>CPU平台不匹配</li>
<li>加载类库时,写错类库名字</li>
</ul>
<h3 id="CPU平台不匹配时的解决办法:"><a href="#CPU平台不匹配时的解决办法:" class="headerlink" title="CPU平台不匹配时的解决办法:"></a>CPU平台不匹配时的解决办法:</h3><p>Generating x86 machine code is simple: just add ‘x86’ to your APP_ABI definition in your Application.mk file,for example:<br><code>APP_ABI := armabi armabi-v7a x86</code></p>
<p>Alternatively,since NDK r7,you can use:<br><code>APP_ABI := all</code></p>
<p>2、本地方法找不到</p>
<ul>
<li>忘记加载类库</li>
<li>c代码中方法名写错</li>
</ul>
<h2 id="javah命令"><a href="#javah命令" class="headerlink" title="javah命令"></a>javah命令</h2><p>使用javah命令可以自动生成.h头文件</p>
<ul>
<li>jdk 1.7中在src目录下执行javah 包名.类名</li>
<li>在jdk 1.6中在bin/classes目录下执行</li>
</ul>
<h2 id="使用Jni-c-c-调用java代码"><a href="#使用Jni-c-c-调用java代码" class="headerlink" title="使用Jni (c/c++调用java代码)"></a>使用Jni (c/c++调用java代码)</h2><h3 id="在c中打log在java编辑器中输出log日志的方法"><a href="#在c中打log在java编辑器中输出log日志的方法" class="headerlink" title="在c中打log在java编辑器中输出log日志的方法"></a>在c中打log在java编辑器中输出log日志的方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">#include <jni.h></span><br><span class="line">#include <android/log.h></span><br><span class="line">#define LOG_TAG "System.out"</span><br><span class="line">#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)</span><br><span class="line">#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__)</span><br><span class="line"><span class="function">JNIEXPORT <span class="keyword">void</span> JNICALL <span class="title">Java_com_lsm_MainActivity_helloc</span><span class="params">(JNIEnv * env,jobject obj)</span></span>{</span><br><span class="line"> <span class="comment">//打印log输出</span></span><br><span class="line"> LOGD(<span class="string">"hello!"</span>);</span><br><span class="line"> LOGI(<span class="string">"hello!"</span>);</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="反射"><a href="#反射" class="headerlink" title="反射"></a>反射</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Dialog</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">show</span><span class="params">(String message)</span></span>{</span><br><span class="line"> System.out.println(<span class="string">"对话框弹出:"</span>+message);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span></span>{</span><br><span class="line"> <span class="keyword">try</span>{</span><br><span class="line"> <span class="comment">//拿到类的字节码</span></span><br><span class="line"> Class <span class="class"><span class="keyword">class</span> </span>= Demo.class.getClassLoader().loadClass("Dialog");</span><br><span class="line"> <span class="comment">//拿到方法</span></span><br><span class="line"> Method method = class.getDeclaredMethod("show",String.class);</span><br><span class="line"> <span class="comment">//调用方法</span></span><br><span class="line"> method.invoke(class.newInstance(),"好久没黑小智了");</span><br><span class="line"> }<span class="keyword">catch</span>(Exception e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="c语言中调用java方法"><a href="#c语言中调用java方法" class="headerlink" title="c语言中调用java方法"></a>c语言中调用java方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">JNIEXPORT <span class="keyword">void</span> JNICALL <span class="title">Java_com_lsm_MainActivity_helloc</span><span class="params">(JNIEnv * env,jobject obj)</span></span>{</span><br><span class="line"> <span class="comment">//打印log输出</span></span><br><span class="line"> LOGD(<span class="string">"hello!"</span>);</span><br><span class="line"> LOGI(<span class="string">"hello!"</span>);</span><br><span class="line"> <span class="comment">//jclass (*FindClass)(JNIEnv*,const char*);</span></span><br><span class="line"> jclass <span class="class"><span class="keyword">class</span> </span>= (*env)->FindClass(env,<span class="string">"com/lsm/MainActivity"</span>);</span><br><span class="line"> <span class="comment">//jmethodID (*GetMethodID)(JNIEnv*,jclass,const char*,const char*);</span></span><br><span class="line"> jmethodID methodID =(*env)->GetMethodID(env,class,"show","(Ljava/lang/String;)V");</span><br><span class="line"> <span class="comment">//void (*CallVoidMethod)(JNIEnv*,jobject,jmethodID,...);</span></span><br><span class="line"> (*env)->CallVoidMethod(env,obj,methodID,(*env)->NewStringUTF(env,<span class="string">"ohohoho"</span>));</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="c向c-改造"><a href="#c向c-改造" class="headerlink" title="c向c++改造"></a>c向c++改造</h3><ol>
<li>把c文件后缀名换成cpp</li>
<li>Android.mk文件中的hello.c也换成hello.cpp</li>
<li>c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全部都是一样的,只是参数去掉了结构体指针</li>
<li>访问函数指针时,把env签名的*号去掉,因为此时env已经是一级指针</li>
</ol>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2016/08/15/%E4%BD%BF%E7%94%A8%E6%B2%89%E6%B5%B8%E5%BC%8F%E5%AE%9E%E7%8E%B0%E5%85%A8%E5%B1%8F%E6%A8%A1%E5%BC%8F/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="John Doe">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2016/08/15/%E4%BD%BF%E7%94%A8%E6%B2%89%E6%B5%B8%E5%BC%8F%E5%AE%9E%E7%8E%B0%E5%85%A8%E5%B1%8F%E6%A8%A1%E5%BC%8F/" class="post-title-link" itemprop="url">使用沉浸式实现全屏模式</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2016-08-15 11:16:33" itemprop="dateCreated datePublished" datetime="2016-08-15T11:16:33+08:00">2016-08-15</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-09-07 19:25:53" itemprop="dateModified" datetime="2020-09-07T19:25:53+08:00">2020-09-07</time>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<hr>
<blockquote>
<p> 强调内容Android 4.4系统(API等级19)引入了一个新 SYSTEM_UI_FLAG_IMMERSIVE为标志 setSystemUiVisibility() ,可以让您的应用程序去真正的“全屏幕”。这个标志,当与结合 SYSTEM_UI_FLAG_HIDE_NAVIGATION和 SYSTEM_UI_FLAG_FULLSCREEN标志,隐藏导航栏和状态栏,让您的应用程序捕获屏幕上的所有触摸事件。</p>
</blockquote>
<hr>
<ul>
<li><strong>使用非粘性浸入</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">// This snippet hides the system bars.</span><br><span class="line">private void hideSystemUI() {</span><br><span class="line"> // Set the IMMERSIVE flag.</span><br><span class="line"> // Set the content to appear under the system bars so that the content</span><br><span class="line"> // doesn't resize when the system bars hide and show.</span><br><span class="line"> mDecorView.setSystemUiVisibility(</span><br><span class="line"> View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span><br><span class="line"> | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span><br><span class="line"> | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN</span><br><span class="line"> | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar</span><br><span class="line"> | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar</span><br><span class="line"> | View.SYSTEM_UI_FLAG_IMMERSIVE);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">// This snippet shows the system bars. It does this by removing all the flags</span><br><span class="line">// except for the ones that make the content appear under the system bars.</span><br><span class="line">private void showSystemUI() {</span><br><span class="line"> mDecorView.setSystemUiVisibility(</span><br><span class="line"> View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span><br><span class="line"> | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span><br><span class="line"> | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<hr>
<ul>
<li><strong>使用粘性浸入</strong></li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">decorView.setSystemUiVisibility(</span><br><span class="line"> View.SYSTEM_UI_FLAG_LAYOUT_STABLE</span><br><span class="line"> | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION</span><br><span class="line"> | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN</span><br><span class="line"> | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION</span><br><span class="line"> | View.SYSTEM_UI_FLAG_FULLSCREEN</span><br><span class="line"> | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}</span><br></pre></td></tr></table></figure>
<hr>
<blockquote>
<p>粘性浸入:使用粘性浸入系统栏自动片刻后能再次隐藏,注意:标记的”粘性”浸入不触发任何听众,如在此模式下暂时显示system bar处于过渡状态。一般像阅读器等场景等建议使用粘性浸入。</p>
</blockquote>
<hr>
<blockquote>
<p>非粘性浸入: 当启用浸入全屏模式,你的activity将继续接收所有触摸事件。用户可以沿所在的system bar正常显示区域向内轻扫显示system bar。这将清除SYSTEM_UI_FLAG_HIDE_NAVIGATION标志和SYSTEM_UI_FLAG_FULLSCREEN标志,如果申请过。使system bar变得可见。这也触发您的 View.OnSystemUiVisibilityChangeListener,如果有设置。</p>
</blockquote>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="http://yoursite.com/2016/07/25/%E5%88%9D%E6%AC%A1%E4%BD%BF%E7%94%A8Hexo%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E7%8B%AC%E7%AB%8B%E5%8D%9A%E5%AE%A2/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="John Doe">
<meta itemprop="description" content="">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hexo">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2016/07/25/%E5%88%9D%E6%AC%A1%E4%BD%BF%E7%94%A8Hexo%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E7%8B%AC%E7%AB%8B%E5%8D%9A%E5%AE%A2/" class="post-title-link" itemprop="url">初次使用Hexo搭建个人独立博客</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2016-07-25 14:18:26" itemprop="dateCreated datePublished" datetime="2016-07-25T14:18:26+08:00">2016-07-25</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-09-07 20:04:05" itemprop="dateModified" datetime="2020-09-07T20:04:05+08:00">2020-09-07</time>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.</p>
<h1 id="安装准备软件"><a href="#安装准备软件" class="headerlink" title="安装准备软件"></a>安装准备软件</h1><p>依次下载安装以下软件,配置教程自行Google<br><a href="https://nodejs.org/en/" target="_blank">Node.js</a><br><a href="https://git-scm.com/" target="_blank">Git</a></p>
<h1 id="注册GitHub"><a href="#注册GitHub" class="headerlink" title="注册GitHub"></a>注册GitHub</h1><p>访问:<a target="_blank" rel="noopener" href="https://github.com/">https://github.com/</a><br>注册你的username和邮箱,邮箱十分重要,GitHub上很多通知都是通过邮箱的。</p>
<h1 id="使用GitHub-Pages建立博客"><a href="#使用GitHub-Pages建立博客" class="headerlink" title="使用GitHub Pages建立博客"></a>使用GitHub Pages建立博客</h1><p>与GitHub建立好链接之后,就可以方便的使用它提供的Pages服务,GitHub Pages分两种,一种是你的GitHub用户名建立的username.github.io这样的用户&组织页(站),另一种是依附项目的pages。<br>博主用到的是第一种,形如longshiming.github.io这样的可访问的站,每个用户名下面只能建立一个。</p>
<h1 id="github上建立仓库"><a href="#github上建立仓库" class="headerlink" title="github上建立仓库"></a>github上建立仓库</h1><p>登录后系统,在github首页,点击页面右下角「New Repository」<br>填写项目信息:<br>project name:longshiming.github.io<br>description:写一些描述文字(当然也可不写)<br>注:Github Pages的Repository名字是特定的,比如我Github账号是longshiming,那么我Github Pages Repository名字就是longshiming.github.io。<br>点击「Create Repository」 完成创建。</p>
<h1 id="用Hexo克隆主题"><a href="#用Hexo克隆主题" class="headerlink" title="用Hexo克隆主题"></a>用Hexo克隆主题</h1><h2 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h2><p>打开git</p>
<blockquote>
<p>$ npm install -g hexo</p>
</blockquote>
<blockquote>
<p>配置config.yml配置文件,关联hexo和github<br>deploy:<br> type: git<br> repo: <a href="mailto:git@github.com">git@github.com</a>:longshiming/longshiming.github.io.git //这里跟据自己的具体情况配置,给出的是我自己的地址<br> branch: master</p>
</blockquote>
<h2 id="部署Hexo"><a href="#部署Hexo" class="headerlink" title="部署Hexo"></a>部署Hexo</h2><blockquote>
<p>$ hexo init blog<br>Hexo随后会自动在目标文件夹建立网站所需要的所有文件<br>现在我们已经搭建起本地hexo博客了,执行一下命令(在blog文件夹所在目录下),然后到浏览器输入locallhost:4000看效果。<br>$ hexo g<br>$ hexo s</p>
</blockquote>
<h2 id="复制主题"><a href="#复制主题" class="headerlink" title="复制主题"></a>复制主题</h2><p>以下进入复制主题环节,如果那一步出现问题,或者修改后没有显示修改的结果,建议之行一下命令,再看看,可以解决很多问题。</p>
<blockquote>
<p>$ hexo clean<br>$ hexo g<br>$ hexo s<br>建立blog文件文件之后就可以复制主题了,以下以jacman为例。<br>$ git clone <a target="_blank" rel="noopener" href="https://github.com/wuchong/jacman.git">https://github.com/wuchong/jacman.git</a> themes/jacman</p>
</blockquote>
<h2 id="启用jacman的主题"><a href="#启用jacman的主题" class="headerlink" title="启用jacman的主题"></a>启用jacman的主题</h2><p>修改blog目录下的config.yml配置文件中的theme属性,将其设置为jacman。同时请设置stylus属性中的compress值为true。</p>
<blockquote>
<p>theme:jacman</p>
</blockquote>
<p>注意:blog有两个config.yml文件,一个在根目录,一个在theme下,此时修改的是在根目录下的。</p>
<h2 id="更新主题"><a href="#更新主题" class="headerlink" title="更新主题"></a>更新主题</h2><blockquote>
<p>$ cd themes/jacman<br>$ git pull</p>
</blockquote>
<p>注意:为避免出错,请先备份你的_config.yml 文件后再升级</p>
<p>本地查看调试</p>
<blockquote>
<p>$ hexo g #生成<br>$ hexo s #启动本地服务,进行文章预览调试</p>
</blockquote>
<p>===================华丽的分割线===================</p>
<h1 id="Hexo命令"><a href="#Hexo命令" class="headerlink" title="Hexo命令"></a>Hexo命令</h1><h2 id="常用命令:"><a href="#常用命令:" class="headerlink" title="常用命令:"></a>常用命令:</h2><ul>
<li><p>$ hexo new “postName” #新建文章</p>
</li>
<li><p>$ hexo new page “pageName” #新建页面</p>
</li>
<li><p>$ hexo generate #生成静态页面至public目录</p>
</li>
<li><p>$ hexo server #开启预览访问端口(默认端口4000,’ctrl + c’关闭server)</p>
</li>
<li><p>$ hexo deploy #将.deploy目录部署到GitHub</p>
<h2 id="常用复合命令:"><a href="#常用复合命令:" class="headerlink" title="常用复合命令:"></a>常用复合命令:</h2></li>
<li><p>$ hexo d -g #生成加部署</p>
</li>
<li><p>$ hexo s -g #预览加部署</p>
<h2 id="简写:"><a href="#简写:" class="headerlink" title="简写:"></a>简写:</h2></li>
<li><p>$ hexo n == hexo new</p>
</li>
<li><p>$ hexo g == hexo generate</p>
</li>
<li><p>$ hexo s == hexo server</p>
</li>
<li><p>$ hexo d == hexo deploy</p>
</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<script>
window.addEventListener('tabs:register', () => {
let { activeClass } = CONFIG.comments;
if (CONFIG.comments.storage) {
activeClass = localStorage.getItem('comments_active') || activeClass;
}
if (activeClass) {
let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
if (activeTab) {
activeTab.click();
}
}
});
if (CONFIG.comments.storage) {
window.addEventListener('tabs:click', event => {
if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
let commentClass = event.target.classList[1];
localStorage.setItem('comments_active', commentClass);
});
}
</script>
</div>
<div class="toggle sidebar-toggle">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
<aside class="sidebar">
<div class="sidebar-inner">
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc">
Table of Contents
</li>
<li class="sidebar-nav-overview">
Overview
</li>
</ul>
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<p class="site-author-name" itemprop="name">John Doe</p>
<div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">4</span>
<span class="site-state-item-name">posts</span>
</a>
</div>
</nav>
</div>
</div>
</div>
</aside>
<div id="sidebar-dimmer"></div>
</div>
</main>
<footer class="footer">
<div class="footer-inner">
<div class="copyright">
©
<span itemprop="copyrightYear">2020</span>
<span class="with-love">
<i class="fa fa-heart"></i>
</span>
<span class="author" itemprop="copyrightHolder">John Doe</span>
</div>
<div class="powered-by">Powered by <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> & <a href="https://muse.theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Muse</a>
</div>
</div>
</footer>
</div>
<script src="/lib/anime.min.js"></script>
<script src="/lib/velocity/velocity.min.js"></script>
<script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script>
<script src="/js/motion.js"></script>
<script src="/js/schemes/muse.js"></script>
<script src="/js/next-boot.js"></script>
</body>
</html>