主要参考文献:
深入理解Android,卷1
Android 5.0 源码
http://blog.csdn.net/sodino/article/details/41946607
学识尚浅,错误之处请指正。
#####为什么需要JNI?
JNI(Java Native Interface的简称),中文翻译为java本地调用接口,名字已经很形象的说明了这个技术的作用,就是支持java这种高级编程语言对本地函数的调用,主要包括C/C++等语言编写的函数。
主要参考文献:
深入理解Android,卷1
Android 5.0 源码
http://blog.csdn.net/sodino/article/details/41946607
学识尚浅,错误之处请指正。
#####为什么需要JNI?
JNI(Java Native Interface的简称),中文翻译为java本地调用接口,名字已经很形象的说明了这个技术的作用,就是支持java这种高级编程语言对本地函数的调用,主要包括C/C++等语言编写的函数。
使用repo下载谷歌源码时,出现了如下错误。
执行 $repo init -u git远程库地址 -b git分支 命令时出现:
1 | error: in sync: [Errno 2] No such file or directory: u'/home/ubuntu/workspace/packages/apps/VoiceDialer/.git/HEAD' |
解决办法:
将文件夹删除,其父文件夹中的 .repo文件夹也删除。
创新建立文件夹,再执行$repo init
错误消失
本文为学习笔记,资料来自网络
$mkdir test 创建实验目录,例如test,名字随意
$touch hello.c 创建hello.c文件
$vim hello.c 编写hello.c代码,主要完成打印“hello world”功能
hello.c 文件内容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//hello world driver for linux
//包含必要的头文件,主要存在于linux内核源码中
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
//打印hello world的函数
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world! from kernel space....\n");
return 0;
}
//打印goodbye的函数
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, world! Leaving kernel space....\n");
}
//module_init()指明模块的入口,这是必需的;
//module_exit()指明模块的出口,这也是必需的。
//传入的参数,上面的两个函数
module_init(hello_init);
module_exit(hello_exit);
为了方便使用make功能进行编译,make首先会扫面目录下的Makefile中的内容进行编译。
在与hello.c同一目录下创建一个Makefile文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//编译目标对象,注意这里的后缀名是.o
obj-m += hello.o
#pwd 当前所在目录
CURRENT_PATH:=$(shell pwd)
#uname -r 查看当前的kernel版本
LINUX_KERNEL:=$(shell uname -r)
#t生成linux内核的绝对路径
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#编译使用的命令
all:
//注意:make -C前面是一个TAB,否则会出现语法错误
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#clean 使用的命令
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
cd到.c文件所在目录,执行make命令。
执行ls查看生成的文件。成功的情况应该有一下文件,其中,hello.ko就是模块目标文件1
2hello.c hello.mod.c hello.o modules.order
hello.ko hello.mod.o Makefile Module.symvers
$ sudo insmod hello.ko 将模块加载到内核中
此时,我们是看不到模块的输出的,需要查看日志
$dmesg 就能看到日志中输出的hello world,说明模块加载成功,如果日志过多,可使用$dmesg -c清除日志
$ sudo rmmod hello.ko
$dmesg 就能看到日志中的goodbye,说明模块卸载成功
make时出现make: Nothing to be done for `all’.
解决此问题可以尝试一下两种方式:
总所周知,git是一种分布式版本控制工具。
举个简单的例子来说:每当你要修改一个文件的时候,为了保证可以恢复到修改前的状态,我们一般采取的措施是,copy一份作为原始备份,然后在对文件进行修改。但是我们有通常会遇到很多混乱的情况让我们非常的头疼,比如我有一份hello.txt,经过n次修改后出现了hello1.txt,hello2.txt,hello3.txt等好多的版本,当我想要去找回我删除的某些内容时,需要挨个打开对比查找非常的麻烦,或者出现写着写着直接放弃hello3,直接在hello2上做 修改,于是又出现一个hello2_副本.txt,想要整理一下删除某些文件,又怕删除的东西还有价值;除此之外,如果hello.txt需要两个人一起处理,A从你这里copy了一份,进行编辑,你自己也继续进行编辑,结果最后进行整合的时候可想而知,非常的令人头疼。
more >>
自定义控件方式:
来实现定制的控件效果
为什么自定义控件呢?
在所有的设备显示同样的效果,不同的手机厂商对系统的控件做了修改,所以不同的手机显示不一样;在不同的设备统一风格;系统自带控件功能有限或者太多;实现特定的效果。
但是尽量使用系统的控件,因为自己写的可能出现bug.
在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数;内存限制为512M;请写出算法设计思路;
中位数的定义:一个给定排序好的序列,奇数个的话,我们就取中间的一个;偶数个的话,我们一般取中间两个数的平均值;因此对于本题,我们需得到中间的第50亿和第50亿+1这两个数;
首先512M的内存,如果都来装这个32位整数的话,可以存储2^(9+10+10)/4=2^27(134217728)个数(1亿左右的数);常规的内部排序肯定是不行了,因为内存不够;而且是乱序排列,所以二分查找不行;所以本题的时间复杂度最少为O(n);
由于内存是512M,可存储1亿个数;那么我们先把100亿个数分成100组;使用512M高内存可装载1亿个数,装载100次;
HTTP 通信机制是在一次完整的 HTTP 通信过程中,Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:
在 HTTP 工作开始之前,Web 浏览器首先要通过网络与 Web 服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是 80。
more >>
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true