-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
511 lines (350 loc) · 28.7 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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>技术分享</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="我思故我在">
<meta property="og:type" content="website">
<meta property="og:title" content="技术分享">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="技术分享">
<meta property="og:description" content="我思故我在">
<meta property="og:locale" content="zh-CN">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="技术分享">
<meta name="twitter:description" content="我思故我在">
<link rel="alternate" href="/atom.xml" title="技术分享" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/Blog/css/style.css">
</head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/Blog/" id="logo">技术分享</a>
</h1>
<h2 id="subtitle-wrap">
<a href="/Blog/" id="subtitle">总结技术经验</a>
</h2>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/Blog/">Home</a>
<a class="main-nav-link" href="/Blog/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
<a id="nav-search-btn" class="nav-icon" title="搜索"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-AndroidStudio3-0项目迁移踩坑" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/Blog/2017/10/27/AndroidStudio3-0项目迁移踩坑/" class="article-date">
<time datetime="2017-10-27T13:39:00.000Z" itemprop="datePublished">2017-10-27</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/Blog/categories/Android/">Android</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/Blog/2017/10/27/AndroidStudio3-0项目迁移踩坑/">AndroidStudio3.0项目迁移踩坑</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<hr>
<p><em>AndroidStudio3.0刚刚发布两天,便迫不及待的升级了,升级前也明白这次的版本跨度较大,老项目可能存在很多的问题,没成想还是从中午折腾到了晚上十点.不过结果还不错,成功的跑起来了项目. 列出踩过的坑,希望后面要升级的小伙伴遇到类似的问题可以做个参考;</em></p>
<hr>
<h5 id="1-升级安装"><a href="#1-升级安装" class="headerlink" title="1.升级安装"></a>1.升级安装</h5><p>两种升级方法:</p>
<ul>
<li><p>直接用自带的更新工具<br> 操作步骤: >菜单栏>Help>Check for Updates..(前提网络要绝对的畅通,你懂的)<br> <img src="images/pasted-AS手动检查更新版本.png" alt="如图"></p>
</li>
<li><p>手动的下载新的版本<br>下载地址<a href="https://developer.android.google.cn/studio/archive.html#android-studio-3-0?utm_source=androiddevtools.cn&utm_medium=website" target="_blank" rel="external">https://developer.android.google.cn/studio/archive.html#android-studio-3-0?utm_source=androiddevtools.cn&utm_medium=website</a></p>
</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/10/27/AndroidStudio3-0项目迁移踩坑/" data-id="cj9auv2q70003hggn4z5pobhu" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/Blog/tags/AndroidStudio/">AndroidStudio</a></li></ul>
</footer>
</div>
</article>
<article id="post-ndroid-PDF加载框架" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/Blog/2017/10/24/ndroid-PDF加载框架/" class="article-date">
<time datetime="2017-10-24T11:36:36.000Z" itemprop="datePublished">2017-10-24</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/Blog/2017/10/24/ndroid-PDF加载框架/">Android PDF加载框架</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/10/24/ndroid-PDF加载框架/" data-id="cj9auv2qf0007hggn1myvar3d" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-hexo-github博客框架搭建" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/Blog/2017/09/08/hexo-github博客框架搭建/" class="article-date">
<time datetime="2017-09-08T01:37:46.000Z" itemprop="datePublished">2017-09-08</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/Blog/2017/09/08/hexo-github博客框架搭建/">hexo+github博客框架搭建</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/08/hexo-github博客框架搭建/" data-id="cj9auv2py0001hggn51xae0q1" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-Jenkins-Android持续集成配置" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/Blog/2017/09/08/Jenkins-Android持续集成配置/" class="article-date">
<time datetime="2017-09-08T01:36:12.000Z" itemprop="datePublished">2017-09-08</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/Blog/2017/09/08/Jenkins-Android持续集成配置/">Jenkins+Android持续集成配置</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/08/Jenkins-Android持续集成配置/" data-id="cj9auv2q30002hggni5m1yal3" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-Gradle在项目中的配置技巧" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/Blog/2017/09/08/Gradle在项目中的配置技巧/" class="article-date">
<time datetime="2017-09-08T01:35:23.000Z" itemprop="datePublished">2017-09-08</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/Blog/2017/09/08/Gradle在项目中的配置技巧/">Gradle在Android项目中的配置技巧</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h6 id="1-不使用字符串依赖-而是直接使用开源项目源码"><a href="#1-不使用字符串依赖-而是直接使用开源项目源码" class="headerlink" title="1.不使用字符串依赖,而是直接使用开源项目源码"></a>1.不使用字符串依赖,而是直接使用开源项目源码</h6><h6 id="2-使用aar库"><a href="#2-使用aar库" class="headerlink" title="2.使用aar库"></a>2.使用aar库</h6><h6 id="3-apk体积精简"><a href="#3-apk体积精简" class="headerlink" title="3.apk体积精简"></a>3.apk体积精简</h6><h6 id="4-结合git实现自动版本号"><a href="#4-结合git实现自动版本号" class="headerlink" title="4.结合git实现自动版本号"></a>4.结合git实现自动版本号</h6><h6 id="5-统一依赖库中的版本号"><a href="#5-统一依赖库中的版本号" class="headerlink" title="5.统一依赖库中的版本号"></a>5.统一依赖库中的版本号</h6><h6 id="6-依赖库BuildConfig中Debug字段失效问题处理"><a href="#6-依赖库BuildConfig中Debug字段失效问题处理" class="headerlink" title="6.依赖库BuildConfig中Debug字段失效问题处理"></a>6.依赖库BuildConfig中Debug字段失效问题处理</h6><h6 id="7-生成release或debug的apk文件追加信息"><a href="#7-生成release或debug的apk文件追加信息" class="headerlink" title="7.生成release或debug的apk文件追加信息"></a>7.生成release或debug的apk文件追加信息</h6><h6 id="8-生成多渠道包"><a href="#8-生成多渠道包" class="headerlink" title="8.生成多渠道包"></a>8.生成多渠道包</h6>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/08/Gradle在项目中的配置技巧/" data-id="cj9auv2pq0000hggnjiusd60h" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-Studio2-2中基本配置和使用" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/Blog/2017/09/07/Studio2-2中基本配置和使用/" class="article-date">
<time datetime="2017-09-07T07:46:00.000Z" itemprop="datePublished">2017-09-07</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/Blog/2017/09/07/Studio2-2中基本配置和使用/">JNI在Android Studio2.2中基本配置和使用</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h3 id="1-是什么"><a href="#1-是什么" class="headerlink" title="1.是什么?"></a>1.是什么?</h3><p>1.JNI (Java Native Interface) 它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。<br>由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。</p>
<p> 2.NDK<br>Native Develop Kit(本地开发工具包),类似于JDK;只是一套工具,它可以帮助开发者在android开发中,它使用的是JNI机制.</p>
<p> 3.两者的区别<br>JNI Java Native Interface <strong>java调用本地接口 的技术名词</strong><br>NDK Native Developer Kit <strong>谷歌给开发人员的工具包</strong></p>
<p><br></p>
<h3 id="2-使用ndkBuilder进行项目的构建"><a href="#2-使用ndkBuilder进行项目的构建" class="headerlink" title="2.使用ndkBuilder进行项目的构建"></a>2.使用ndkBuilder进行项目的构建</h3><ul>
<li><strong>1. 下载ndk(已装,略过)</strong><br><img src="http://upload-images.jianshu.io/upload_images/1868359-9a1c080319c82bb9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/520" alt="ndk下载.png"><br><strong>进入项目设置界面</strong></li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1868359-488651ab5b6c22fe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/520" alt="20160531123154969.png"><br><strong>没有安装的话,直接Download即可,PS.在最终安装的时候会卡很长时间,耐心等待安装完成</strong></p>
<ul>
<li><p><strong>2. 配置app,build.gradle文件</strong></p>
<ol>
<li>在app的build.gradle中,也就是要运行的项目中的build.gradle文件中的defaultConfig节点中增加<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">ndk {</div><div class="line"> moduleName <span class="string">"NdkJniDemo"</span> <span class="comment">//生成的so名字</span></div><div class="line"> ldLibs <span class="string">"log"</span>, <span class="string">"z"</span>, <span class="string">"m"</span> <span class="comment">//添加依赖库文件,因为有log打印等//非必填加项</span></div><div class="line"> abiFilters <span class="string">"armeabi"</span>, <span class="string">"armeabi-v7a"</span>, <span class="string">"x86"</span> <span class="comment">//输出指定三种abi体系结构下的so库,目前可有可无。//不填写则生成所有</span></div><div class="line"> }</div></pre></td></tr></table></figure>
</li>
</ol>
</li>
<li><p><strong>3. 创建本地需要创建调用C的代码,这里使用一个获取字符串的方法为例</strong><br>新建一个工具类JniUtils,使用C获取一个字符串,然后展示到一个</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">JniUtils</span> </span>{</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">native</span> String <span class="title">getStringFormC</span><span class="params">()</span></span>;</div><div class="line"> ...可以有很多的<span class="keyword">native</span>代码</div><div class="line">}</div></pre></td></tr></table></figure>
</li>
</ul>
<p><strong> 使用native关键字,表示调用本地的方法,该方法可以使用C/C++语言来实现</strong></p>
<ul>
<li><strong>4. 生成.h,C/C++的头文件(熟悉C的知道,可以没有头文件,头文件只是定义类中所有方法(C中没有类的概念))</strong><ol>
<li>build或rebuild或clear一下程序之后,会在build/intermediates/classes/debug目录中生成项目中的所有的class文件,<br><img src="http://upload-images.jianshu.io/upload_images/1868359-d206b645febdea15.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="class文件路径.png"></li>
<li>命令行进入debug目录cd <路径></li>
<li>编译指令<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">javah -jni com.wobiancao.ndkjnidemo.ndk.JniUtils</div></pre></td></tr></table></figure>
</li>
</ol>
</li>
</ul>
<p><strong>注意 这里javah -jni后面跟的是JniUtils类的全路径,如果javah报不存在之 类的,是你的java环境没有配置好。</strong></p>
<ul>
<li><p><strong>5. 编译过后会在debug目录下生成一个.h的文件,它的命名方式会很长,基本 是全路径的命名方式</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">jonathanhsia_com_ndktest_utils_JniUtils.h</div></pre></td></tr></table></figure>
</li>
<li><p><strong>6. 拷贝文件到项目中的main/jni目录下,如果没有直接创建即可</strong></p>
</li>
<li><p><strong>7. 编写C的方法实现</strong></p>
<ol>
<li>在jni目录下新建C/C++文件,引用头文件,复写其中的java要调用的C/C++方法,返回一个字符串,</li>
</ol>
</li>
<li><strong>8. 在JniUtils中静态导入C/C++所生成的so包</strong><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">static</span> {</div><div class="line"> System.loadLibrary(<span class="string">"NdkJniDemo"</span>);<span class="comment">//之前在build.gradle里面设置的so名字,必须一致</span></div><div class="line"> }</div></pre></td></tr></table></figure>
</li>
</ul>
<p><strong>此时run之后java代码即可以调用到用C/C++实现的代码了</strong></p>
<p>“PS. 在run之后,会在build/intermediates/ndk/debug/lib目录下会出现在build.gradle中配置的三种cpu架构的so包,此时删除jni目录中的源码,将这些so包直接的拷入到项目中就可以直接的使用了”</p>
<p><strong>遇到的坑</strong></p>
<ol>
<li>C/C++不能格式化代码,否则会出现,编译通过(可能编译出错,但是没有阻止运行),运行不了,报出找不到so包的异常</li>
<li><p>首次run的时候可能报出 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Error: NDK integration is d eprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.</div></pre></td></tr></table></figure>
<p>这样的错误,按照里面的提示在gradle.properties文件中增加android.useDeprecatedNdk=true字段即可</p>
</li>
<li><strong>不支持intant run</strong></li>
<li>两个c同时实现h中的方法,会报错,不允许,逻辑上也是不允许;</li>
<li>JniUtils的位置不能够随便已经,因为和C/C++文件中是一一对应的引用关系</li>
</ol>
<p><br></p>
<h3 id="3-使用cmake进行项目的构建"><a href="#3-使用cmake进行项目的构建" class="headerlink" title="3.使用cmake进行项目的构建"></a>3.使用cmake进行项目的构建</h3><ul>
<li><strong> 1. cmake编辑功能是android studio 2.2才支持的新功能;目的是简化jni的开发过程,使用studio2.2新建项目的话,会有相应的让你勾选使用cmake </strong></li>
</ul>
<p><img src="http://upload-images.jianshu.io/upload_images/1868359-1a7efb11460f8b8e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/520" alt="1474439172560.png"></p>
<p><img src="http://upload-images.jianshu.io/upload_images/1868359-8fc9b325d79ba95f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/520" alt="1474439229866.png"></p>
<hr>
<ul>
<li><p><strong>2.当勾选了include C++ Support时,在创建项目的时候,会多出如上界面,选择C/C++的标准,此处的设置在app的build.gradle中的defaultConfig会增加设置</strong></p>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"> externalNativeBuild {</div><div class="line"> cmake {</div><div class="line"> cppFlags <span class="string">"-frtti -fexceptions"</span><span class="comment">//这个标记是第一个选项,如果使用C++11的标准,则使用</span></div><div class="line"> <span class="comment">//cppFlags "-std=c++11"</span></div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
</li>
<li><p><strong>3.在build.gradle中的android节点下面会增加配置,指定生成so文件配置文件的路径</strong></p>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">externalNativeBuild {</div><div class="line"> cmake {</div><div class="line"> path <span class="string">"CMakeLists.txt"</span></div><div class="line"> }</div><div class="line"> }</div></pre></td></tr></table></figure>
</li>
<li><p><strong>4.创建需要调用C/C++代码的java代码,和ndkBuilder相同</strong></p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">JniUtils</span> </span>{</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">native</span> String <span class="title">getStrFromC2</span><span class="params">()</span></span>;</div><div class="line">}</div></pre></td></tr></table></figure>
</li>
<li><p><strong>5.在项目中src/main/中创建cpp目录,里面可以直接的创建cpp源代码,和ndkBuild一样,用C/C++所写的源代码中的方法名称必须是全路径的方法名,然后以Java开头,分割使用下划线.</strong></p>
</li>
</ul>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><jni.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><string></span></span></div><div class="line"></div><div class="line"><span class="keyword">extern</span> <span class="string">"C"</span></div><div class="line">jstring</div><div class="line">Java_com_ndkcmaketestapp_utils_JniUtils_getStrFromC2(JNIEnv *env, jobject thiz) {</div><div class="line"> <span class="built_in">std</span>::<span class="built_in">string</span> hello = <span class="string">"Hello from C++ Two!"</span>;</div><div class="line"> <span class="keyword">return</span> env->NewStringUTF(hello.c_str());</div><div class="line">}</div></pre></td></tr></table></figure>
<ul>
<li><p><strong>6.CMakeLists.txt文件中的具体配置</strong></p>
<figure class="highlight gradle"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">cmake_minimum_required(VERSION <span class="number">3.4</span>.<span class="number">1</span>) #指定cmake版本</div><div class="line">add_library(form SHARED src<span class="regexp">/main/</span>cpp<span class="regexp">/form.cpp) #hello是生成的so文件的名称,要和cpp文件的名称相同</span></div><div class="line"><span class="regexp">target_link_libraries(hello log android) # 此处增加了,日志的链接库</span></div></pre></td></tr></table></figure>
</li>
<li><p><strong>7.在java代码中增加引用so库的代码,使代码生效</strong></p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">JniUtils</span> </span>{</div><div class="line"></div><div class="line"> <span class="comment">// Used to load the 'native-lib' library on application startup.</span></div><div class="line"> <span class="keyword">static</span> {</div><div class="line"> System.loadLibrary(<span class="string">"form"</span>);<span class="comment">//此处的form库的名称需要和CMakeLists.txt中配置的相同</span></div><div class="line"> }</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">native</span> String <span class="title">getStrFromC2</span><span class="params">()</span></span>;</div><div class="line">}</div></pre></td></tr></table></figure>
</li>
<li><p><strong>8.在run成功之后,会在build目录的上方增加.externalNativeBuild目录,其中.externalNativeBuild/cmake/debug/obj包含所有生成的so包,同样的拷贝到项目中的jniLibs就可以直接的使用</strong></p>
<blockquote>
<p>CMake的优势</p>
<ul>
<li>1.可以直接的在C/C++代码中加入断点,进行调试</li>
<li>2.java引用的C/C++中的方法,可以直接<code>ctrl+左键</code>进入</li>
<li>3.对于include的头文件,或者库,也可以直接的进入</li>
<li>4.不需要配置命令行操作,手动的生成头文件,不需要配置<code>android.useDeprecatedNdk=true</code>属性</li>
</ul>
</blockquote>
</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/07/Studio2-2中基本配置和使用/" data-id="cj9auv2q90004hggn8b293azf" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/Blog/tags/Android/">Android</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/Blog/tags/jni/">jni</a></li></ul>
</footer>
</div>
</article>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">分类</h3>
<div class="widget">
<ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/Blog/categories/Android/">Android</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">标签</h3>
<div class="widget">
<ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/Blog/tags/Android/">Android</a></li><li class="tag-list-item"><a class="tag-list-link" href="/Blog/tags/AndroidStudio/">AndroidStudio</a></li><li class="tag-list-item"><a class="tag-list-link" href="/Blog/tags/jni/">jni</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">标签云</h3>
<div class="widget tagcloud">
<a href="/Blog/tags/Android/" style="font-size: 10px;">Android</a> <a href="/Blog/tags/AndroidStudio/" style="font-size: 10px;">AndroidStudio</a> <a href="/Blog/tags/jni/" style="font-size: 10px;">jni</a>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">归档</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/Blog/archives/2017/10/">十月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/Blog/archives/2017/09/">九月 2017</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">最新文章</h3>
<div class="widget">
<ul>
<li>
<a href="/Blog/2017/10/27/AndroidStudio3-0项目迁移踩坑/">AndroidStudio3.0项目迁移踩坑</a>
</li>
<li>
<a href="/Blog/2017/10/24/ndroid-PDF加载框架/">Android PDF加载框架</a>
</li>
<li>
<a href="/Blog/2017/09/08/hexo-github博客框架搭建/">hexo+github博客框架搭建</a>
</li>
<li>
<a href="/Blog/2017/09/08/Jenkins-Android持续集成配置/">Jenkins+Android持续集成配置</a>
</li>
<li>
<a href="/Blog/2017/09/08/Gradle在项目中的配置技巧/">Gradle在Android项目中的配置技巧</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2017 Jonathan Hsia<br>
Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/Blog/" class="mobile-nav-link">Home</a>
<a href="/Blog/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<link rel="stylesheet" href="/Blog/fancybox/jquery.fancybox.css">
<script src="/Blog/fancybox/jquery.fancybox.pack.js"></script>
<script src="/Blog/js/script.js"></script>
</div>
</body>
</html>