安卓深入系统完全讲解(34)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

什么是 NDK Android NDK 是为了 Android 应用开发人员去嵌入用 C 或者 C++ 这种编译成本地机器码到自己的应用开发包里面提供的一套开发环境。开发者可以使用这个开发包来编译可在 Android 运行的库或者可执行文件也是可以跑本地应用的但一般不这么用因为对于开发者来说系统服务基本都是 Java 语言实现的用 C 或者 C++ 调用不是常规开发思路。NDK 中提供移植好的可在 Android 执行的封装库并且做好了编译工具链配置方法方便开发者快速移植实现功能。为什么要用 NDK为了提升性能C 、C++ 语言编译出来运行在硬件环境上比起 Java 虚拟机环境有性能优势。有些三方库或者自己之前开发好的 C 、C++ 源码需要直接使用比如一些算法库游戏中的三角形四边形的碰撞判定。Java 虚拟机就是 C 、C++ 实现的不支持两个之间调用也说不过去。类似与我用 C 、C++语言实现了一套解析固定格式的文件然后调用对应的本地方法运行。OpenGL ES2.0 、 Cocos2d-x 、FFmpeg 等开发过程中需要使用 C 、C++ 而 Android 本身语言是 Java 。比如 FFmpeg 移植过来有时会使用 SDL 框架进行渲染而这个是 C 语言编写的。

NDK 编译出来的目标类型动态库扩展为.so静态库扩展为.a可执行文件 (这个一般没有后缀)这几类在 Linux 环境下都属于 ELF 格式只是动态库和静态库可执行文件有区别而已。动态库可以有未知的符号数据只要指明在哪个动态库去找即可系统在运行时候加载这个动态库的时候会对导入符号进行查找找到会自动加载进来找不到就会报错。静态库必须将所有符号确定每个符号都必须存在才能编出来否则会在链接过程报错某个符号找不到某个方法未定义。可执行文件如果引用一个动态库只要指明动态库在哪里即可如果引用一个静态库静态库必须每个符号都是已定义的同时如果要编成可执行文件必须实现一个 main 方法因为这个是程序的入口点。程序在被加载进入内存后会先进行环境初始化(堆与栈的设置)然后跳到 main 方法执行。具体详情阅读《链接器与加载器》和《程序员的自我修养》。NDK 下载这里使用两个版本一个很老r8 的一个很新r19 的。为什么下载 r8 呢因为它里面的 docs 目录很经典是最好的开发文档。 r19 是最新的要在 6.0 以上手机跑起来需要较新版本编译因为-fpic-fpie 这几个要求。PIC 和 PIE 代表意思是位置无关的动态库和位置无关的可执行。关于什么是位置无关举个例子。操场上站了一排人你在第九个位置你距离门 90 米你后面有个人在第十个位置他距离门 100 米。有个人找他可以说就在距离门 100 米的位置也可以说在你后面 10 米处。这时候整个队伍移动了 100 米这时候有人找他说距离门 100 米的位置就是错误的了但是说在你后面 10 米还是对的。也就是相对位置和绝对位置的关系从指令上说就是相对寻址和绝对寻址的关系。Android后续新的版本强制需要这个位置无关配置。本 课 程 的 所 有 源 码 可 以 在 如 下 地 址 下 载 链 接 提 取 码 dxkn 或https://pan.baidu.com/s/1RmBTfw7tUec70XReB0ZdPA者https://github.com/luxiaoming/Android_NDK_GitChat因为 r19 很大这里不让提交所以 GitHub 上面少这个压缩包

写个 hello JNI 可执行文件5.1 Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= hello-exe LOCAL_SRC_FILES := hello-exe.c LOCAL_LDLIBS :=-fpic-fPIE-pie include $(BUILD_EXECUTABLE) 5.2 Application.mk APP_STL := c++_static APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti APP_ABI := armeabi-v7a 5.3 hello-exe.c #include <string.hinclude <jni.h> #include <stdio.h> int main() { }

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android