简单了解一下.so

2019-02-17  本文已影响2人  初心一点

做Android应用开发的同学接触NDK还是偏少的,但是第三方库引用多了,难免被NDK给坑个几次

今天就来对NDK做个概况了解

第一点:先认识一些文件

  1. .h头文件

写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

#ifndef CIRCLE_H
#define CIRCLE_H

// 代码写在这里
// 这样做是为了防止重复编译,不这样做就有可能出错。
// 至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。
// 原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。
#endif
  1. .c文件是C源文件、.cpp文件是C++源文件
  1. 源文件(.cpp)主要写实现头文件中已经声明函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件
  2. .h文件和cpp文件也就是说,在h文件中声明Declare,而在cpp文件中定义Define。 “声明”向计算机介绍名字是什么意思。而“定义”为这个名字分配存储空间。无论涉及到变量时还是函数时含义都一样
  1. java代码如何跟.c、.cpp文件交互:
  1. .java文件编写。
  2. .class文件生成。
  3. 产生C头文件 *.h
  4. 编写jni实现代码 *.c
  5. 最终生成动态链接库 *.so
  6. 在JAVA代码中调用 System.loadLibrary("xxx")
  7. 然后java代码就可以调用native标识的方法了

第二点:NDK使用场景

  1. 引用第三方库(C、C++),因为大部分开源库都用C、C++开发。例如:opencv人脸识别、WebRTC等等
  2. 便于移植,方便一套代码Android,ios都可以使用
  3. 复杂算法的逻辑或加密逻辑可以用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架构(目前是七种)

参考链接:

  1. https://www.cnblogs.com/fenghuan/p/4794514.html
  2. https://zhuanlan.zhihu.com/p/23102158
  3. http://www.mamicode.com/info-detail-1680973.html
  4. https://blog.csdn.net/potato512/article/details/52312565
  5. https://blog.csdn.net/stupid56862/article/details/72617065
  6. https://segmentfault.com/a/1190000005646078
  7. https://blog.csdn.net/smallwei2014/article/details/74475105
上一篇 下一篇

猜你喜欢

热点阅读