00_问题及复习
堆之中的内存管理:
分成一个一个小段,然后将他们穿起来
你申请多大的空间,系统会将堆中相对最少的内存段给你,并不是真的给你多大的内存,所以申请来的内存很可能比申请的大
堆之中的内存不能重复释放,防止释放别人刚申请的内存空间
不能释放申请的一部分内存,不能逐步释放
01_指针的大小
根据CPU的位数或者操作系统的位数决定:
32位:4
64位:8
02_二级指针
二级指针变量存的是一级指针变量的地址
在32位平台上依然是4字节的长度
03_结构体类型及变量
04_结构体变量的成员访问方法
优先级
05_函数指针
函数在代码段的起始地址,函数入口地址
要加括号
C中不能定义变量
写函数指针的时候先确定参数,最后再写函数名
06_联合体与枚举
联合体:
枚举:0开始
07_typedef关键字
typedef 作用是给己经存在的数据类型
int a;//a是变量名,是一个标识符
typedef int a;//typedef 让a成为与int 完全等价的类型名
a b;//用类型别名定义变量
int c;//用原类型名定义量
a <=> int
struct Student *pstu;//pstu是一个结构体指针变量,是一个标识符
typedef struct Student *pstu;//typedef 让pstu成为了与struct Student*等价的类型别名
pstu k;
struct Student *m;
08_相关概念及工具介绍
交叉编译:
在一个平台上为另一个平台编译程序:不同的操作系统Windows Linux ,不同的处理器架构 Intel ARM
Host:编译程序的平台,主机
Target:运行程序的平台,目标机
主机编译:相当于自己倒酒喝
交叉编译:给别人倒酒喝
交叉编译工具链:编译套件提供一系列,顺序调用,形成链条
arm-linux-gcc
使用工具:NDK(Native Development Kits)本地开发工具集
包含交叉编译工具链,但不止这些
NDK帮助我们生产本地库,并插入
CDT:C/C++ Development Tools 本质上是Eclipse的一个插件
Cygwin:已被封装到了NDK,在Windows提供了一个Unix模拟运行环境
09_NDK目录介绍
docs 开发文档推荐D:/android-ndk-r9d/documentation.html
Build目录:.mk 指导编译的配置文件
platform:安卓各个版本,系统头文件
premake:提供了一些编译编译工具
make.exe:工程管理器,自动编译,需要自己写.mk文件
samples:例子
source:源码目录
toolchains:交叉编译的工具链
ndk-bulid.cmd: 包装了make工具,谷歌提供
10_JNI开发流程
阶段一 编码
-
创建Android工程,用native声明本地方法
由本地方法实现
-
需要在工程新建jni目录,实现.c的源文件
#include<jni.h>
/*
* jni规定本地方法名在实现的时候,本地方法名Java_调用本地方法类所在的包名以及类名
* 最后才是方法名
*
* JNIEnv *env java环境,提供函数供调用
* jobjectobj调用本地方法的对象
*
* typedef conststruct JNINativeInterface* JNIEnv;
* env :JNIEnv * <> struct JNINativeInterface **
* (*env) -> NewStringUTF();
*/
jstring Java_com_example_helloworld_MainActivity_helloFromC(JNIEnv *env,jobject obj){
// c中字符1个字节,java两个字节
// jstring (*NewStringUTF)(JNIEnv*,const char*);把C的字符串转换成java里面的字符串
return (*env)->NewStringUTF(env,"hello world");
}
阶段二 编译
-
在jni目录下,新建Android.mk文件(固定)
LOCAL_PATH :=$(call my-dir)#指定当前路径
include$(CLEAR_VARS) #清楚全局配置变量,LOCALXXX,除了LOCAL_PATH
LOCAL_MODULE :=hello #指定生成生成动态库名,libhello.so
LOCAL_SRC_FILES :=hello.c #指定生成动态库的源文件
include$(BUILD_SHARED_LIBRARY)#指定生成动态库
-
在jni目录下用ndk-build命令编译生成.so动态库(把ndk-build工具添加到path)
-
在类中动态加载动态库
static{
System.loadLibrary("hello");// 动态库名,不是文件名(libhello.so)
}
在path里面添加ndk的安装目录
程序目录不能有空格
**工程的名字不要以数字加下划线开头
11_JNI手动开发例子
12_JNI开发的常见错误
-
找不到动态库
Couldn't load resultfr0mc: findLibrary returned null
-
库名写错,或者生成动态库与运行平台不符合
-
找不到方法
清空.so文件:ndk-build clean
**工程目录不能加_
-
检查jni函数名写的对不对
-
没有加载库:System.loadLibrary("动态链接库名,不是.c");
13_javah命令使用
JNIEXPORT:作用域控制
全部不要加_(下划线)
在1.7之前在 /bin 目录中用 javah
在1.7及之后再 /src 目录中用 javah
14_eclipse结合NDK进行jni开发流程
-
新建工程,声明本地方法
-
指定工程添加 add Native support,修改其中源文件后缀为.c ,在Android.mk文件中也要修改
见参考图片
-
指定jni.h头文件路径,见gif图片上面的
-
进入工程src目录执行javah命令(jdk1.7),进入bin/classes里面执行javah(1.6)
把jni函数声明拷贝到.c源文件当中
-
实现本地jni函数
-
在类中调用加载动态库
15_中国人民很行客户端
可以用C对卡号和密码进行加密,即使反编译也是汇编代码