回顾:
指针
指针其实就是代表的内存地址
地址就是系统给内存分配的编号
指针变量 存放地址的变量
两个常见的错误
1 不给指针赋值 直接调用 野指针
2 指针类型和地址的类型不匹配
float t
int* i=&t
指针和指针变量混淆
int* p
(*p).age; * 的优先级特别的低
* 号的三种含义
1 乘法
2 如果*在类型后 代表是该类型的指针变量类型
3 * 如果再指针变量前
指针常见错误
32 位 4G内存 8G
64位
int 2^32
.dll windows下库函数
.so 动态函数库 体积小 别的库里面的函数动态加载进来
.a 静态的库函数 只要用到的函数包括别的包的 都打包进来
指针和数组的关系
// 数组中的元素在一块连续的内存地址中
// 数组变量的内存地址对应的是数组中第一个元素的内存地址
同类型的指针默认的偏移量是不一样的 int* 偏移4个字节
指针的运算
内存分配
静态内存
动态内存
C语言 内存
.data // 常量池
.code 区 // 存放的都是代码
main();
.stack;// 占内存 所有静态分配的内存 都放在栈内存中 吃完吐 连续分配 先进后出 队列 先进先出 吃完拉
堆内存 // 动态分配的内存 都放在堆内存中, 不是连续分配内存的
free() ;// 手动释放内存 硬盘删除文件 30次
malloc memorry alloc
// class Person{
int age;
String name;
char sex;'m'
}
char* c 可以表示字符串
*01 ndk环境的搭建
windows .exe
.dll
linux elf .so
1 编译阶段
2 连接阶段
Java -> .class -> java的虚拟机
C -> .0中间文件 -> .exe .dll
.elf .so .a
linux
arm .so
x86
windows
需要在windows下的环境 把c代码打包成 手机能用的函数库
首先模拟手机的环境
1 NDK
.sh linux 批处理文件
.bat windows
头文件 stdio.h 编译器 interface
库函数 连接器 class 实现类
由于ndk有很多linux的批处理文件
最早基于linux开发
2 工具2 cygdriver 模拟linux系统环境 (windows操作系统)
linux系统的模拟器
linux 把所有设备都生成了一个文件
3 cdt 为了方便在eclipse开发c代码 让c代码高亮显示
c/c++ developer tools
adt
android developer tools
*02 HelloWorldFromC
交叉编译 怎么用java代码调用c代码
armeabi // arme cpu anroid binary interface
// 1 定义一个c方法的接口 相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的
public native String helloWorldFromC();
// // 2 步 实现C代码
方法名 严格按照jni的规范 jstring Java_com_example_helloworldformc_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj)
3
/ andrond.mk 告诉编译器 如何把c代码打包成函数库
// 3 生成 .mk文件
// 4步 把c代码 打包成函数库 用到了安装的环境
// 5 步在java代码中 引入库函数
static{
System.loadLibrary("hello");// 注意事项 去掉前面的lib 后面的.so
}
//6 使用方法
*03 jni 开发常见的错误
1 自动生成 java本地方法对应的c代码的方法名 javah 指令 +全雷鸣
1.6 class
C:\workspace\HelloWorldFromC2\bin\classes
1.7 src
C:\workspace\HelloWorldFromC2\src
Anroid.mk 文件
LOCAL_PATH := $(call my-dir) // 返回当前c代码目录
include $(CLEAR_VARS) // 清楚了所有 已local 开头的配置文件 唯独不清楚LOCAL_PATH
LOCAL_MODULE := hello // 库函数的名字 严格遵守makefile 格式 lib .so 如果前面加lib 不会自动生成了
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY) // 加入库函数
jni 常见的错误
1错误1 忘记方法的参数
2 错误2 203-28 03:41:56.758: E/AndroidRuntime(821): java.lang.UnsatisfiedLinkError: Native method not found: com.example.error.DemoActivity.helloWorld:()Ljava/lang/String;
3 错误3 一般没有日志打印 直接报错工程停止 一般c代码有运行错误
4 错误4 在交叉编译的工具链上报错 c代码有编译错误 比如 一些函数没有声明 一些类型没有声明 少符号
5 错误5 没有Android.mk 文件
6 错误6 Android.mk 文件有错
7 错误7 引用别人.so 函数库 需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致