Android Gradle编译so库或运行时出现 text relocations 崩溃的正确解决方法

1、so库编译时出现

这种情况一般是使用了新版的NDK编译造成的,新版的ndk将warning视为error,

解决方法: 在Android.mk里面加入#LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true

这种方法编译的so库不能运行在target api为23以上的机器。

2、Android运行时崩溃提示

这种情况主要是因为从 API 23 开始,共享对象将不得包含文本重定位。也就是说,代码必须按原样加载,不得对其进行修改。这种方法减少了加载时间,并提高了安全性。文本重定位的常见原因是使用了非定位独立手写汇编程序。

解决方法:2.1、第三方库的话编译时开启 -fPIC (position independent code) 或者--enable-pic支持,由于这种原因大部分是由于汇编语言造成的,可能还得开启--disable-asm的形式。

2.2、Android.mk 加上LOCAL_CFLAGS := -fPIC,so库需要能在新版NDK上编译通过(不能使用1的解决方法)

2.3、使用scanelf -qT libyour.so的形式检查so库,参考此文https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide

3、附

3.1、API23 面向NDK开发者的Android变更

3.2、http://stackoverflow.com/questions/32346402/libavcodec-so-has-text-relocations

3.3、http://blog.csdn.net/cantus_hjk/article/details/51979635

时间: 2024-10-10 21:47:07

Android Gradle编译so库或运行时出现 text relocations 崩溃的正确解决方法的相关文章

Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 Android Gradle编译学习日记(基于 Android Studio 1.0): Android Gradle编译学习日记之一(搭建 Gradle 环境以及编译 Android 应用) 在上一篇文章中,我简单介绍了一个 Gradle 环境变量的搭建,以及如何使用 Gradle 编译 Android

Android Gradle编译学习日记之一(搭建 Gradle 环境以及编译 Android 应用)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 Google 在最近正式推出了 Android Studio 1.0版本,开发者首页的默认开发工具也已经更改成了 Android Studio,我想我们是时候全面转型到 Android Studio 开发了. 其实抛开界面因素,Android Studio 与 Eclipse ADT 构建 Android

android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在android studio jni项目 cmake 里面,需要先引用openssl的.a再引用 上面封装的.a; 如果使用so,那么,直接在android studio jni项目的 cpp里面直接调用openssl的方法,对外提供jni java接口,打包成so即可: 先来说用ndk-build 打

关于javac编译时出现“非法字符:\65279”的解决方法

一般用UE或记事本编辑过的UTF-8的文件头会加入BOM标识,该标识由3个char组成.在UTF-8的标准里该BOM标识是可有可无的,Sun 的javac 在编译带有BOM的UTF-8的格式的文件时会出现"非法字符:\65279"的错误,但是用Eclipse进行编译却没有问题,原因在于Eclipse使用的是自己的JDT,而非javac,关于JDT的描述可以到eclipse的官网上去查看. 出现这种情况时,有两种解决方法: a) 利用UE.Editplus等文本编辑器重新保存文件为不带B

Android 开发环境jdk配置 执行javac提示不是内部或外部命令解决方法

'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件.问题解决方法分享! 'JAVA' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法相似. 原因一:没有安装jdk,只安装了jre 1 jdk1.7.0_60+jre才是完整的,如果没有安装jdk的话,在cmd里边输入javac就会提示"'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件" 步骤阅读 2 解决方法是安装jdk END 百度经验:jingyan.baidu.com 安装了JD

VC项目中,构造 CString 时,提示 explicit constructors (C2440) 的解决方法

其实还是 ANSI 和 UNICODE 编码的问题. 可以使用宏 _T() 包裹字符串,使得 ANSI 和 UNICODE 兼容.如 CString strJustAnother (_T ("This is a TCHAR string a.k.a. LPCTSTR")); 或者,给那些不想改代码人的偷懒方法,屏蔽掉这个编译错误: 在 stdafx.h 文件中你一般会发现这个宏  _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 的声明. #define _ATL_

水晶报表 Crystal Report 调用存储过程时出错 找不到表 ,解决方法。

用 CrystalReportViewer1 控件在asp.net的网页上显示报表,如果做报表时调用数据表数据的方式调用是可以成功的,但报表是用存储过程获取数据方式会出现以下错误: 找不到表'RptOpenCheck;1' . 文件 G:\TEMP\FO-OpenCheck {6D191F06-DECF-4A25-88FC-8553E3D435AA}.rpt 内出错: 找不到表. Error: 未将对象引用设置到对象的实例. The table 'RptOpenCheck;1' could no

【Mongodb教程 第一课补加课2 】MongoDB下,启动服务时,出现“服务没有响应控制功能”解决方法

如图,如果通过下列代码,添加服务后,使用net start命令出现这样的问题时,可以参考下我的解决方法. D:\MongoDB>mongod --dbpath D:\MongoDB\Data --logpath D:\MongoDB\Log\MongoDB.log --logappend --serviceName MongoDB --auth --install 解决方法: 出现这个问题一般是路径有问题. 1)请注意你所有的路径没有错,包括mongod所在路径,日志所在路径等: 2)不要加入多

红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695