交叉编译
- 系统平台:Windows、Mac OS、Linux
- CPU平台:ARM、X86、MIPS
- 概念:在一个平台下打包编译出还有一个平台能够运行的程序#交叉编译原理
- 源代码->预编译->编译->链接->可运行程序
- 原理:模拟还有一个平台的特性去编译代码#交叉编译工具链*ToolChains,一个工具运行完成自己主动运行下一个工具#常见工具
- NDK:native developement kits
- CDT:eclipse插件,C/C++ developement tool。高亮显示C语言keyword
- cygwin:Linux命令行模拟器#NDK文件夹结构
- doc:帮助文档
- build/tools:linux的批处理文件
- platforms:开发jni过程中会用到的头文件和C语言类库
- prebuilt:预编译时用到的工具
- samples:JNI的使用案例
- sources:NDK源代码
- toolchains:编译打包时用到的工具链
- ndk-build.cmd:開始编译打包JNI代码
JNI开发流程
- 创建jni目录,创建c文件
- 在java类中定义本地方法
-
在C文件里定义函数实现本地方法
//函数名必须是Java开头,_连接包名类名方法名 jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject thiz)
-
创建Android.mk文件。指定要编译的c文件和模块名字
-
在jni文件夹下运行ndk-build.cmd指令。编译打包出动态链接库
-
在java代码中载入动态链接库。调用本地方法
-
部署项目
常见错误
找不到类库
- 没有加入x86支持
- 载入动态链接库时写错模块名###本地方法找不到
- 忘记载入动态链接库
- c函数名写错
javah
- 自己主动生成jni样式的头文件
- java1.7:在src文件夹下 运行javah com.itheima.helloworld2.MainActivity
- java1.6:在bin/classes文件夹下 运行javah com.itheima.helloworld2.MainActivity
加入本地支持
- 须要先指定NDK目录
- 自己主动生成jni目录和cpp文件、Android.mk文件
- 能够指定include目录的路径
- 每次部署项目时。开发环境会自己主动编译打包出so类库
javap
- 打印方法的签名
- 在bin/classes文件夹下 javap -s com.itheima.calljava.MainActivity