交叉编译
- 在一个平台下编译出另一个平台可以执行的二进制文件
- 不同平台是彼此不兼容的
- CPU平台:x86,arm,mips
- 系统平台:Windows,Linux,Mac os
- 原理:模拟另一个平台的特性去编译代码
开发工具
- NDK:native development kits
- CDT:C/C++ development tools
- 高亮显示C语言关键字
NDK目录
- build/tools:存放了大量Linux的批处理文件,用于模拟Linux特性交叉编译
- docs:离线帮助文档
- platforms:按照Android版本分了若干个文件夹
- 按系统平台分了3个文件夹
- usr:Unix system resource
- include:开发jni会用到的头文件
- lib:编译运行C代码时会用到的so动态链接库
- usr:Unix system resource
- 按系统平台分了3个文件夹
- sample:使用jni的案例
- sources:ndk的源码
- ndk-build:编译C代码,打包成so类库
JNI流程
- 在java代码定义本地方法
- 在项目根目录下创建jni文件夹,文件夹中创建c文件
- c文件中定义函数实现java的本地方法
- 函数的命名要注意返回值、包名、类名本地方法名和方法的参数
- 在jni文件夹下创建Android.mk文件,配置要编译的c文件是哪一个
- 编译打包c文件,生成so类库
- 在java代码中,加载so类库,然后调用本地方法
常见错误
找不到类库
- 类库名写错了
- 没有添加相应平台的支持
找不到本地方法
- 没有加载类库
- C函数名写错
javah
- 生成函数声明
- 1.7:在src目录下执行javah com.itheima.helloworld2.MainActivity
- 1.6:在bin/classes目录下执行
添加本地支持
- 自动创建jni文件夹,文件夹中自动创建cpp文件和Android.mk文件
- 项目可以指定jni.h头文件的路径
- c文件中可以实时编译
- 项目部署时,自动编译打包出so类库,然后才会部署到手机上
- 在jni–》application。mk–》添加“APP_ABI := armeabi x86”
javap
- 在bin/classes目录下执行javap -s com.itheima.helloworld2.MainActivity