NDK开发尝试

使用 Android Studio进行NDk开发

最近几天都在学习Android NDk开发,在网上搜索和一大堆教程,很多东西都有些太老了,初学者看得雲里雾里,而我也刚好先写一篇基础博客,方便刚刚接触的有些了解,下面开始正题
本文将讲解有以下几点
本文NDk开发流程图
还有在Android Studio 2.2版本中,我们可以在CMakeLists.txt文件中进行类似Android.mk文件的设置,而且cpp文件夹和jni的文件夹基本是一个含义。我们现在先采用ndk-build方法编译,而使用Cmake编译,可能会在下一篇博客中介绍

下载NDK,并在Android Studio 设置NDK快捷技巧

在使用 Android Studio 上tools 工具里找到Android 点击里面的Android SDK 去下载NDK,同时勾选CMake,和LLDB
下载完以后,我们直接在Android Studio 上设置ndk-build快捷方式

打开Settings,找到下图的Tools,External Tools 选项

ndk快捷方式step1

创建javah命令

创建javah 命令,用于在一个生成Java 类的头文件,之间出现在Jni目录下,自己不需要创建Jni目录,会在main 目录下自动创建生成文件,介绍Tools settings

  1. program 是你的使用工具的目录,
  2. Parameters 是你的程序后面的参数,下图意思是生成文件时UTF-8格式的
    注意,要记得加 -classpath . 这个参数不然会出现
    错误: 找不到 'com.example.HelloJni.HelloJni' 的类文件。
  3. Working directory 是源文件路径,这里时Java源文件路径

ndk快捷方式step2

创建ndk-build命令

ndk-build不需要参数就可以编译,编译完后会在main目录下产生两个目录libs和obj
libs就是最终生成的so动态链接库
obj是中间过程文件,暂时不用考虑
ndk快捷方式step3

创建ndk-build clean命令

这个是清除原本使用的ndk-build命令
ndk快捷方式step4

零散知识点

开发中的知识点问题

JAVA

Android

  1. NDK 开发 java生成头文件问题
    Android中使用javah命令做NDK开发时,要采用的java -classpath . -jni com.example.hellojni.HelloJni 少了-classpath . 这个会出现
    错误: 找不到 ‘com.example.hellojni.HelloJni’ 的类文件。
  2. NDK 引用错误
    Android NDK 开发中链接第三方库时,使用dlsym方法时,下面的方式在C++中使用时会报错误

    1
    2
    void (*test)();
    test = dlsym(handle, "test");

    错误原因是,因为dlsym返回的是void*, 但是C++不允许隐形转换通用指针,所以会报错。可以通过下面方式改写

    1
    2
    void (*test)();
    test = (void (*)()) dlsym(handle, "test");

dataStrucute

线性表

链表

栈和队列

队列

KMP匹配算法

树的定义

二叉树

二叉树的基本的5中基本形态:
1.空二叉树
2.只有一个根结点
3.根结点只有左子树
4.根结点只有右子树
5.根结点既有左子树又有右子树

特殊二叉树

1.斜树
2.满二叉树
3.完全二叉树
完全二叉树是每个结点位置的编号要与满二叉树相同位置的编号相同
特点
(1)叶子结点只能出现在最下两层。
(2)最下层的叶子一定集中在左部连续位置。
(3)倒数二层,若有叶子结点,一定都在左部连续位置。
(4)如果结点度为1,则该结点只有左孩子,既不存在只有右子树的情况。
(5)同样结点数的二叉树,完全二叉树的深度最小。

Java编程思想读书笔记(三)

通过异常处理错误

Java标准异常

RuntimeException,由它继承而来的异常被称为“不受检查的异常”。这种异常属于错误,会自动被捕获,不用我们自己去动手。所以我们可以不用在异常声明中声明方法将被抛出RuntimeException类型的异常。要注意到的是只能在代码中忽略RuntimeException及子类的异常,其他异常都是由编译器强制实施的,而RuntimeException算编程错误。
Exception是所有“被检查的异常”的基类。

用finally进行清理

当要把出内存之外的资源恢复到它们的初始状态,就要finally子句,对于没有垃圾回收和构析函数自动调用机制的语言来说,finally可以是程序员保证:无论try快里发生了什么,内存总能的到释放。因为finally字句总是会执行的,所以在一个方法中,可以从多喝点返回,并且可以保证重要的清理工作仍旧会执行:

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
public class MultipleReturns {
public static void f(int i) {
System.out.println("Initialization that requires cleanup");
try {
System.out.println("Point 1");
if(i == 1) return;
System.out.println("Point 2");
if(i == 2) return;
System.out.println("Point 3");
if(i == 3) return;
System.out.println("End");
return;
} finall {
System.out.println("Performing cleanup");
}
}
public static void main(Stringp[] args) {
for(int i = 1; i <= 4; i++) {
f(i);
}
}
} /* Output:
Initialization that requires cleanup
Point 1
Performing cleanup
Initialization that requires cleanup
Point 1
Point 2
Performing cleanup
Initialization that requires cleanup
Point 1
Point 2
Point 3
Performing cleanup
Initialization that requires cleanup
Point 1
Point 2
Point 3
End
Performing cleanup
*///:~

Java编程思想读书笔记(二)

复用类

final 关键字

1.final 对基本类型运用时,能让基本类型数值保持不变,但对于对象引用时,能够保持对象的引用不变,但是对于对象自身的是可以被修改的,这个在不可变对象使用中要注意到这个问题。

多态

转机

1.导出类无法覆盖基类的私有方法,在向上转型中,调用的私有方法时,得到的是基类的私有方法运行的结果。
只有非peivate方法不会被覆盖。
2.当导出类转型为基类时,调用的任何域访问操作都将由编译器解析,因此不是多态的,所以当该对象使用某个域的值时,得到的结果是基类的域的结果,不是子类相同域的结果。还有静态方法也不具有多态性。

构造器和多态

1.创建对象调用构造器时,初始化的实际过程:
1)在其他对象任何事物发生之前,将分配给对象的存储空间初始化为二进制的零
2)调用基类构造器。不断递归下去,从最顶层的基类到最底层的导出类。(还有补充,请看下面的代码)
3)按声明顺序调用成员的初始化方法。
4)调用导出类构造器的主体

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
class Glyph {
void draw() {
System.out.println("Glyph.draw()");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
} /* Output:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
*///:~

Java编程思想读书笔记(一)

《Thinking in Java》这本书几个月前就在看了,但是自己的Java基础比较差,到后面一些东西看得有些懵逼,上个月勉强看完了。自己现在做一些读书笔记吧,也把自己看这本书的获得知识以及思考分享给大家,我会画出这本书的思维导图给大家看下,我的文笔很烂,表达不清楚,或者说的太多废话,望大家不要介意,还有一些东西可能由错误,有什么意见也可以指点出,谢谢了!

对象导论

本章是让没有了解面向对象程序设计的人,进行了解的,是背景性,补充性材料。Alan Kay总结的面向对象语言的五基本特性:
1.万物皆为对象
2.程序是对象的集合,它们通过发送消息老告知彼此所要做的事
3.每个对象都有自己的由其它对象所构成的存储
4.每个对象都拥有其类型
5.某一特定类型的所有对象都可以接收同样的消息
理解:所有东西都可以分类,比如书这一类,人这一类,那么人在仔细分,就是具体到我们每个人了,我们是独一无二的,我们单独自己就是一个对象,是人这一类中的一个例子,而程序就好比我们一个整体,比如一个班级,包含是一个班人,就是我们的集合,我们一个人是一个对象,而班级像程序一样也要运行,班主任告知学生和任课老师要做的事,任课老师也告知彼此要做的事。而第三点,万物都是对象,所以具体的书本也是对象,以及器官也是对象,那么我们每个人也是由其它的对象组成的。而每个对象都有自己的分类,比如人类,书类等。比如上课了,学生都要在自己笔记本上做笔记,学生是一个特定的类型,学生们都接收了这个消息。
每个对象都由自己的状态,行为和标识,状态就好比类里变量赋予了值,行为就是类里定义的方法,但由可以根据对象的不同使方法产生不同的结果,好比 东施效颦 产生了不同的结果,而对象都是特定的独一无二的,在内存里每个对象都由唯一一个地址,我们人也一样,就算是双胞胎,也有不一样的因素。
接口就好比人会思考这个技能一样,原本所有动物都没有的,但是人类添加了这个接口,实现了这个接口定义的思考这个方法。
所谓的继承就是一层层关系下来的,比如书,书有很多种类,文学,科普什么的,然后文学这类算继承了书这一类,而文学里还有各种分类,最后到具体的某一本书名了,所以这是一步一步地继承下去的。
封装就像任课老师们教的课一样,而班主任只需要告诉任课老师们把学生教好,至于任课老师所教的课的东西,怎么教好学生都不用班主任管理,每个任课老师(一个接口),就每个任课老师讲课这些方式就像接口内部实现一样,以及接口外部调用者(班主任),这是就是封装了!
而多态就是好比一道母题,根据它的特性生成很多子题,子题继承了母题,不过更改了母题的条件,这样让母题有多种实现的方式,不同子题对母题的不同实现方式!

第一次Android学习总结

今天总结的是由郭霖大神写的《第一行代码Android》

这本书很值得新人去看我的第一本Android书就是这个,在一个月前就看完了,可是一直没有时间去总结这本书的知识点!这对于学习来说很是被动的,不去总结很难获得什么经验,特别是对于我这种记忆力不知道有多差的人来说更是灾难!首先上一张图,我自己画的思维导图:

我的博客搭建过程

今天基本把我的博客给搞好了,就差域名备好案了

我是用hexo 在阿里云服务器(CentOS 7系统)上用nginx 运行的 然后用push钩子,在本地用git push完后自动部署到你的服务器上,我在网上看到很多教程,但是有一些比较久了,自己看的也迷迷糊糊的.今天就讲一下我的搭建过程,希望有用.

hexo 使用

先下载nodejs,在你自己的本地电脑,还有阿里云服务器都要下载,我本机系统是ubuntu15.10,具体怎么下载google吧
下载完后是npm安装

1
npm install hexo -g

用下面语句,测试是不是成功

1
hexo help

接着就是在~/目录里建立一个文件夹(blog)

1
cd ~/blog

1
hexo init

在阿里云centos7.0 上安装mysql最新版方法

使用rpm方法

1.在http://dev.mysql.com/downloads/mysql/#downloads 上选择
(1):(mysql-community-common-5.7.11-1.el7.x86_64.rpm)
(2):(mysql-community-libs-5.7.11-1.el7.x86_64.rpm)
(3):(mysql-community-client-5.7.11-1.el7.x86_64.rpm)
(4):(mysql-community-devel-5.7.11-1.el7.x86_64.rpm)
(5):(mysql-community-server-5.7.11-1.el7.x86_64.rpm)

5条命令来安装上面5个;

1
[root@iZ28m9hwbnmZ ~]# wget -c http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-community-common-5.7.11-1.el7.x86_64.rpm