安卓深入系统完全讲解(34)
Posted 程序员入门进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓深入系统完全讲解(34)相关的知识,希望对你有一定的参考价值。
什么是 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()
以上是关于安卓深入系统完全讲解(34)的主要内容,如果未能解决你的问题,请参考以下文章