结论:Android Jni编程中不允许跨模块返回一个空的string类型
例子:当前有两个模块A,B,在不同的库文件中
   
using namespace A
{
std::string GetString()
{
std::string str = "";
return str;
}
}

using namespace B
{
void GetResult()
{
std::string str = A::GetString();
}
}

一旦调用GetResult,就会发生错误,按照崩溃的信息
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xdeadbaad
Abort message: 'invalid address or address of corrupt block 0x358e4 passed to dlfree'
    r0 00000000  r1 f7643dec  r2 deadbaad  r3 00000000
    r4 000358e4  r5 f76450f8  r6 aaff3000  r7 e41a28c4
    r8 12d080e0  r9 ab00b490  sl 12d46500  fp 12d46500
    ip 00000080  sp fffddb48  lr f7614fe7  pc f7614fe8  cpsr 600f0030
    d0  0000000000000000  d1  6120726f2073736c
    d2  6f20737365726466  d3  707572726f632072
    d4  ab1e7e80ab1e7e80  d5  0000000000000000
    d6  00740065004e002e  d7  006b0072006f0077
    d8  0000000000000000  d9  0000000000000000
    d10 0000000000000000  d11 0000000000000000
    d12 0000000000000000  d13 0000000000000000
    d14 0000000000000000  d15 0000000000000000
    d16 0000000000000000  d17 0000278c00000000
    d18 6ffeabe86ffeabe8  d19 6ffeabe86ffeabe8
    d20 6ffeabe86ffeabe8  d21 6ffeabe86ffeabe8
    d22 6ffeabe86ffeabe8  d23 6ffeabe86ffeabe8
    d24 6ffeabe86ffeabe8  d25 6ffeabe86ffeabe8
    d26 6ffeabe86ffeabe8  d27 6ffeabe86ffeabe8
    d28 6ffeabe86ffeabe8  d29 6ffeabe86ffeabe8
    d30 6ffeabe86ffeabe8  d31 6ffeabe86ffeabe8
    scr 60000011

backtrace:
    #00 pc 00028fe8  /system/lib/libc.so (dlfree+1239)
    #01 pc 0000f2c3  /system/lib/libc.so (free+10)
    #02 pc 0000c630  /data/app/cn.test/lib/arm/libnative.so
大致猜测为当GetString退出当前的模块A作用域,就已经释放了string指向的内存空间,当GetResult函数调用结束的时候,重新释放导致了问题的出现。

在这里如果在同一个模块(同一个库文件)使用,就是GetString和GetResult处于同一个模块,就不会有任何的问题。

或者GetString中定义的str不是一个空字符串,也不会有任何的问题。

目前在java层,jstring 为空,传递给jni层出现错误:
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb38800ec
    r0 00000002  r1 0000002e  r2 ffffffd0  r3 b6d0f2f0
    r4 b6d0f2e8  r5 b38b0f6c  r6 b4cc2000  r7 b3880000
    r8 b4cc9008  r9 b6d02594  sl 00000001  fp 00000000
    ip b38800b8  sp be8e53a8  lr b6ce434b  pc b6ce13ca  cpsr 200f0030
    d0  0000000000000000  d1  0000000000000000
    d2  000003e800000000  d3  0000000000000014
    d4  424831a6528a632c  d5  5aea5aea5aea52e9
    d6  5aea5aea5aea5aea  d7  5aea5aea5aea5aea
    d8  0000000000000000  d9  0000000000000000
    d10 0000000000000000  d11 0000000000000000
    d12 0000000000000000  d13 0000000000000000
    d14 0000000000000000  d15 0000000000000000
    d16 0000043800000780  d17 0000000100000004
    d18 0000004800000002  d19 0000000400000000
    d20 0000000000000033  d21 0000000000000000
    d22 0000000000000000  d23 4ffd51265a458900
    d24 0000000000000001  d25 0001000100050005
    d26 8003800380078007  d27 0023002300030003
    d28 0000000000000000  d29 0000000000000000
    d30 0000000000000000  d31 0000000000000000
    scr 80000012

backtrace:
    #00 pc 000553ca  /system/lib/libc.so (ifree+49)
    #01 pc 00058347  /system/lib/libc.so (je_free+374)
    #02 pc 0000fe1f  /data/app/test/lib/arm/libnative.so
    #03 pc 0000ac61  /data/app/test/lib/arm/libnative.so

已经开始进展的活动:在Linux跨模块测试string空串问题,没有重现,说明Linux没有这个问题,而Android采用的C库是GOOGLE编写的,应该是string的源码处理上有问题,但是在同一个模块是不会有这个问题,而是在跨模块才会有这个问题,又将注意力转移到编译器优化上。

转载于:https://blog.51cto.com/fengyuzaitu/2287421

Android第十七课 Jni string空串跨模块使用崩溃注意事项相关推荐

  1. Android 第十七课 碎片的简单用法及动态添加碎片

    Fragment(碎片)是一种可以嵌入在活动当中的UI片段,它可以让程序更加合理和充分的利用大屏幕的空间.碎片和活动太像了,同样都包含布局,都有自己的声明周期,可以将碎片理解为一种迷你型的活动. 新建 ...

  2. 张绍文android开发高手课读书笔记1

    本系列博文 基于是前微信高级工程师张绍文专栏 <Android开发高手课>的读书笔记. 文章所写内容是本人读完的感悟,需要原文的朋友请自行购买. Android的开发前景如何 移动互联网发 ...

  3. Android面试之百题经典Android答案——cookie,session,JNI,AIDL,Binder,ClassLoader,AMS,WMS,PWS,热更新,插件化,Hook,dex

    一.Activity生命周期 实际面试中可能会以实例形式出现,比如:启动A,再从A启动B,请描述各生命周期 二.Activity的启动模式 Activity的启动模式有4种,分别是Standard.S ...

  4. 2021-04-27 Android 理解frameworks services jni hardware kernel 整个控制过程实例包括回调

    Android 理解frameworks services jni hardware kernel 整个控制过程实例包括回调 一.这个例子的实现的功能是,app控制power pin和control ...

  5. android 中 Proguard 和JNI 相关

    在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...

  6. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  7. Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)...

    原文:Asp.Net Web API 2第十七课--Creating an OData Endpoint in ASP.NET Web API 2(OData终结点) 前言 很久没更新博客了,加上刚过 ...

  8. 【WebRTC】在Android上用NDK编译WebRtc音频增益模块(AGC),降噪(NS),java调用JNI实现功能

    目录 ·········前言 ·········前期工作 ·········编译工作 ·········编码工作(AGC-JAVA) ·········编码工作(AGC-JNI) ·········编 ...

  9. Android 开发高手课 温故知新篇

    首先推荐大家先阅读<Android 开发高手课>和我之前的三篇练习: Android 开发高手课 课后练习(1 ~ 5) Android 开发高手课 课后练习(6 ~ 8,12,17,19 ...

  10. JNI String类型

    在上一篇中介绍了JNI的基本数据类型.本文是JNI系列的第三篇,介绍JNI中的除了基本类型之外的引用类型-String类型. 系列文章的大纲如下: JNI 简介 JNI 基本类型 JNI String ...

最新文章

  1. 全面解析微服务系统监控分层,啃透服务治理核心!
  2. 难以置信!小冰数字孪生虚拟人直播70天,没人发现不是真人
  3. 非静态内部类中为什么不能拥有静态成员?
  4. adb安装软件_安卓手表ADB实用工具箱:给你的安卓手表来点不一样的
  5. Flume之核心架构深入解析
  6. html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析
  7. visual_studio2013、vs2013下载
  8. LayaBox---Dialog弹窗
  9. 懒人脚本查看本机IP地址
  10. 用一年的数据预测下一年数据_一年的招聘数据中的经验教训
  11. Flutter 路由原理解析
  12. WebDay05 JQuery框架
  13. 支付宝推出AR实景红包,开启红包新玩法!
  14. 微信公众号-消息推送
  15. Excel 中用公式列出唯一值——模拟高级筛选功能
  16. pixel 6手机连接wifi,网络受限
  17. Android软件工程师-面试题
  18. 1. Java EE简介 - JavaEE基础系列
  19. 用图记忆C语言中的运算符优先级
  20. 红队渗透-window痕迹清除

热门文章

  1. Atitit 常用微服务实现 目录 1. 健康检测 max_fails与fail_timeout参 数 1 1.1. spring cloud dubbo实现 2 1.2. 、nginx多个tomc
  2. Atitit.软件中见算法 程序设计五大种类算法
  3. atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  4. 剖析 |数据现代化-富国银行的数据转型之路
  5. 通力法评 | 简评中国证监会关于MOM产品的征求意见稿
  6. Rust : codewars的Product of consecutive Fib numbers
  7. Julia : Array !, [1,2] !=[1 2]'
  8. 【优化求解】基于matlab NSGA2算法多技能员工调度优化模型【含Matlab源码 1775期】
  9. 【土壤分类】基于matlab GUI多类SVM土壤分类【含Matlab源码 1398期】
  10. 【图像处理】基于matlab GUI图像滤镜(马赛克+蓝色透镜+素描)【含Matlab源码 1145期】