交叉编译
- 在一个平台下,编译出另一个平台能够执行的二进制的代码
- 平台: Windows,Mac OS,Linux
- 处理器:x86,arm,mips
交叉编译的原理
- 源代码->编译->链接->可执行程序
- 模拟其他平台特性
交叉编译的工具链
- 多个工具的集合,一个工具使用完后接着调用下一个工具
常见工具
- NDK : Native Development kit : 开发jni必备,就是模拟其他平台特性来编译代码的工具
- CDT : C/C++ Development tools
- cygwin:一个模拟器,可以在Windows下运行Linux指令
NDK 目录结构
- docs:帮助文档
- build/tools:Linux的批处理文件
- platforms:对应平台C/C++的编译的头文件和类库
- prebuild:预编译
- samples:JNI样例
- source : NDK源码
- toolchains :工具链
- ndk-build.cmd : 编译打包C代码的一个指令
使用Jni
- 在项目根目录下创建jni文件夹
- 在jni文件夹中创建C文件
- 在Java代码中,创建一个本地方法helloFromC
public native String helloFromC();
- 在Jni中定义函数实现这个方法,函数名必须为:Java_<packageName><className><methodName>。其中两个参数为:(JNIEnv* env, jobject obj)
- 返回一个字符串,用C定义一个字符串
char* cstr = "hello from c";
把C的字符串转换成Java的字符串
jstring jstr = (*env)->NewStringUTF(env,cstr); return jstr;
- 在jni中创建Android.mk文件
- 在C文件中添加<jni.h>头文件
- 在jni文件下执行ndk-build指令
Jni常见错误
- find Library return null
- CPU平台不匹配
- 加载类库时,写错类库名
- 本地方法找不到
- 忘记加载类库
- Jni方法名和native方法名不同