做Android应用开发的同学接触NDK还是偏少的,但是第三方库引用多了,难免被NDK给坑个几次
今天就来对NDK做个概况了解
第一点:先认识一些文件
- .h头文件
写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):
#ifndef CIRCLE_H
#define CIRCLE_H
// 代码写在这里
// 这样做是为了防止重复编译,不这样做就有可能出错。
// 至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。
// 原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。
#endif
- .c文件是C源文件、.cpp文件是C++源文件
- 源文件(.cpp)主要写实现头文件中已经声明函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件
- .h文件和cpp文件也就是说,在h文件中声明Declare,而在cpp文件中定义Define。 “声明”向计算机介绍名字是什么意思。而“定义”为这个名字分配存储空间。无论涉及到变量时还是函数时含义都一样
- java代码如何跟.c、.cpp文件交互:
- .java文件编写。
- .class文件生成。
- 产生C头文件 *.h
- 编写jni实现代码 *.c
- 最终生成动态链接库 *.so
- 在JAVA代码中调用 System.loadLibrary("xxx")
- 然后java代码就可以调用native标识的方法了
第二点:NDK使用场景
- 引用第三方库(C、C++),因为大部分开源库都用C、C++开发。例如:opencv人脸识别、WebRTC等等
- 便于移植,方便一套代码Android,ios都可以使用
- 复杂算法的逻辑或加密逻辑可以用C、C++编写,避免java反编译的劣势
第三点:如何使用.so
在项目里使用SO库非常简单,只需要把需要用到的SO库拷贝进 jniLibs(或者Eclipse项目里面的libs) 中,然后在JAVA代码中调用 System.loadLibrary("xxx") 加载对应的.so,就可以使用JNI语句调用SO库里面的Native方法了
第四点:使用.so时,我们经常会报类似错误
java.lang.UnsatisfiedLinkError
其实这个问题就涉及到手机CPU架构的问题了,目前手机CPU架构绝大多数都是arm架构。ARM处理器,特点是体积小、低功耗、低成本、高性能,所以几乎所有手机处理器都基于ARM,在嵌入式系统中应用广泛
第五点:NDK和SDK区别?
严格说AndroidNDK只是AndroidSDK的一个组件,通过NDK,你就可以用c或c++来开发app了。
第六点:Android支持的cpu架构(目前是七种)
- armeabi 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢
- armeabi-v7a 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能
- arm64-v8a 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit
- x86 intel 32位,一般用于平板
- x86_64 intel 64位,一般用于平板
- mips 少接触
- mips64 少接触
参考链接:
- https://www.cnblogs.com/fenghuan/p/4794514.html
- https://zhuanlan.zhihu.com/p/23102158
- http://www.mamicode.com/info-detail-1680973.html
- https://blog.csdn.net/potato512/article/details/52312565
- https://blog.csdn.net/stupid56862/article/details/72617065
- https://segmentfault.com/a/1190000005646078
- https://blog.csdn.net/smallwei2014/article/details/74475105
网友评论