谈谈Android NDK中动态链接库(.so文件)的优化
做了不少NDK相关的工作,不知道别人有没有同样的困惑,经常在编译C/C++代码的时候会出一些error或者warning,然后在网上搜,发现在Android.mk或者Application.mk文件中加一些配置选项就能解决,但是加完之后却不知道这些都是干什么用的,或者找不到系统学习的地方。我猜可能是开发NDK的程序员对于利用NDK写代码的程序员的能力太过自信,所以没有给出什么参考资料,顶多就是NDK目录下的Doc。这就导致在优化动态链接库的时候,除了提升算法、代码级优化,往往不知从何下手。对于这个问题我也一直很头疼,不过最近算是有了点起色,下面是我个人的理解。
所谓的Android.mk和Application.mk其实和Linux系统中的makefile是非常接近,就是一种用于编译比较大工程并配置编译选项的文件。其中不同的部分一般都是NDK中自己添加的,这些在Doc里面基本都写到了,剩下的部分就都是GCC编译器的选项了,参考网站:
http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/index.html#toc_Invoking-GCC
http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gnat_ugn_unw/Improving-Performance.html#Improving-Performance
在优化动态链接库大小和速度的时候,其实主要就是LOCAL_CFLAGS和LOCAL_LDFLAGS这两个,一般来说在LOCAL_CFLAGS后面追加-O1,O2,O3,Os,Ofast这几个选项就差不多能满足要求,如果感觉还是不满意的话,可以自己再逐项进行优化,比如在LOCAL_CFLAGS追加-ffunction-sections和-fdata-sections,在LOCAL_LDFLAGS追加-Wl,--gc-sections编译选项。这样基本就差不多了。当然,要想进行深入的研究和优化,可能还要好好研究一下gnu官网给出的资料。
谈谈Android NDK中动态链接库(.so文件)的优化的更多相关文章
- 关于Android NDK中调用第三方的动态库
因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...
- Android NDK中的C++调试踩坑标记
RT, Android NDK中的C++调试, GDB调试比较麻烦,在ADT Eclipse中: 1.配置好NDK给工程加上Native Support 2.编译中加上NDK_DEBUG=1 3.然后 ...
- android NDK编译(导入).a文件和编译多个so文件(转)
源:android NDK编译(导入).a文件和编译多个so文件 一.编译一个静态库 libstatic_android.a LOCAL_PATH := $(call my-dir) include ...
- XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...
- XamarinSQLite教程在Xamarin.Android项目中定位数据库文件
XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...
- 【开发必备】今天我们来谈谈Android NDK动态链接库(so文件)的一些见解
一.写在前面 直到现在,基本我写的每一个项目都会用到NDK动态链接库的知识,可见这个也的确十分常用.那么,今天,咱们就来谈谈它. 二.什么是ABI和so 1.发展 早起的Android系统几乎只支持A ...
- [android ndk] -android studio中编译生成so文件
1.android.useDeprecatedNdk=true Error:Execution failed for task ':app:compileDebugNdk'.> Error: N ...
- Android: NDK中的Android.mk和Application.mk
1. 简介 Android.mk 可用来描述要编译的某个具体模块的相关信息.比如:指定编译该模块时所需要的源文件.编译该模块时要链接的库文件.该模块编译完成后生成的库的名字等等.Applicatio ...
- Android Studio中.9.png文件出错问题
昨天使用别人的.9.png图片放在自己的android studio工程下使用,出现如下错误: :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DA ...
随机推荐
- 使用 libvirt创建和管理KVM虚拟机
1. libvirt介绍 Libvirt是一个软件集合,便于使用者管理虚拟机和其他虚拟化功能,比如存储和网络接口管理等等.Libvirt概括起来包括一个API库.一个 daemon(libv ...
- iOSCollectioView滚动到指定section的方法
CollectioView滚动到指定section的方法 项目中的需求:collectionView顶部有一个scrollView组成的标签,点击标签,让collectionView滚动到指定的行 ...
- windows 下,CCXT库的安装
CCTX 是一个 开源的关于数字货币交易的库 github 位置: https://github.com/ccxt/ccxt CCTX python 版本的安装 先安装python 3 然后以管理员的 ...
- java时间操作:获取当天剩余时间
mport org.apache.commons.lang.time.DateUtils; import org.joda.time.DateTime; import org.joda.time.Du ...
- docker 运行redis
自从接触docker之后,很多软件都想着用docker运行,毕竟手动安装的话老是要配一些环境变量啊,找配置文件修改配置什么的,docker却有更简便的办法. 正题: 建一个docker应用容器可以通过 ...
- [转]nginx负载均衡的五种算法
1.round robin(默认) 轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式. 适用于后台机器性能一致的情况. 挂掉的机器可以自动从服务列表中剔除. 2.weight 根据权重来 ...
- ubuntu14.04 3D桌面效果制作
参考:http://www.360doc.com/content/14/0919/22/11681374_410808557.shtml
- PHP利用CURL_MULTI实现多线程
PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,因此可以使用PHP利用CURL_MULTI实现完成多线程类的任务,下面就 ...
- jQuery 与 prototype 共存
方法一: <html> <head> <script src="prototype.js"></script> ...
- jspSmartUpload使用初步
jsp中使用SmartUpload上传文件 1.下载jspSmartUpload组件后,解压缩.把com目录复制到应用程序的WEB-INF\classes目录下. 2.尤其注意 (1)文件上传表单要添 ...