首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当解析字符串数据时,Google在Android中崩溃。

当解析字符串数据时,Google在Android中崩溃。
EN

Stack Overflow用户
提问于 2016-05-11 05:14:56
回答 1查看 1.5K关注 0票数 1

protobuf版本为3.0.0。在某些设备(比如Android 6)中,这个问题总是会发生;而在一些设备(比如Android5.x)中,当应用程序被放到后台模式时,就会出现这个问题。

我调用以下方法:

代码语言:javascript
运行
AI代码解释
复制
bool ParseFromString(const string& data);

这可能在内部称为bool ParseFromArray(const void* data, int size)。堆栈跟踪:

代码语言:javascript
运行
AI代码解释
复制
Build fingerprint: 'lge/b2lds_global_com/b2lds:5.0.2/LRX22G/152532131cf4c:user/release-keys'
 Revision: '1.0'
 ABI: 'arm'
 pid: 9946, tid: 9970, name: ahlaad.saarathy  >>> com.org.aahlaad.saarathy <<< 
 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xdeadbaad
 Abort message: 'invalid address or address of corrupt block 0xa19fca5c passed to dlfree'
     r0 ffffffff  r1 deadbaad  r2 73797300  r3 2e6d6f63
     r4 b6f2bfd8  r5 a19fca5c  r6 a19469e4  r7 b6f310fc
     r8 a19fca64  r9 a1c417b0  sl 00000000  fp a1946a64
     ip 00000000  sp a19469a8  lr b6efe031  pc b6efe034  cpsr 800f0030
 backtrace:
     #00 pc 00027034  /system/lib/libc.so (__bionic_heap_usage_error+35)
     #01 pc 00029853  /system/lib/libc.so (dlfree+1354)
     #02 pc 0000f0e7  /system/lib/libc.so (free+10)
     #03 pc 001bc24d  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libprotobuf.so
     #04 pc 001bc4d7  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libprotobuf.so
===> #05 pc 000dde37  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libprotobuf.so (google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::string*)+50)  
     #06 pc 00060944  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libsaarathyclient.so (Saarathy::Messaging::Convey::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)+480)
     #07 pc 000d7bdd  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libprotobuf.so (google::protobuf::MessageLite::ParseFromString(std::string const&)+48)
     #08 pc 00022d84  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libsaarathyclient.so (Connection::CloudSSL::DecodeProtoBuffer(unsigned int, std::string const&)+580)
     #09 pc 00024f0c  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libsaarathyclient.so (Connection::CloudSSL::Receive()+308)
     #10 pc 0002af68  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libsaarathyclient.so (Util::Synchronized_<Connection::CloudSSL>::Start()::{lambda()#1}::operator()() const+72)
     #11 pc 00091207  /data/app/com.org.aahlaad.saarathy-1/lib/arm/libgnustl_shared.so (execute_native_thread_routine+14)
     #12 pc 00012f57  /system/lib/libc.so (__pthread_start(void*)+30)
     #13 pc 00011017  /system/lib/libc.so (__start_thread+6)

显然,如箭头所示,它在google::protobuf::internal::WireFormatLite::ReadBytes(...)崩溃。这个问题已经在这条线中讨论过了,用户通过将VS2005升级到VS2008来修复这个问题。然而,我们在Android中运行这一功能。

我亦曾提及以下职位,但均告无效:

任何详细的帮助都是非常感谢的,因为我在用Android构建原型库方面还是新手。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-11 23:23:24

我通过下面的步骤解决了上面的问题

步骤1:使用相同的NDK运行时stlport_sharedgnustl_shared,构建JNI源代码和Google C++源代码,我们可以在Application.mk文件中将其定义为

APP_STL := gnustl_shared

我使用gnustl-static构建了我的JNI源代码,这引起了问题。如果您在构建Google源代码时使用不同的运行时,可能会出现问题。您可以在Android CPP支持指南上获得有关android运行时的更多信息。

步骤2:确保您的JNI代码和共享库(libprotobuf.so)引用相同版本的Google库。它可能会在不同的android版本中导致未定义的行为。

您可以从Google Protobuf Git Repo下载最新的源代码

您可以遵循Android平台外部原型链接的构建步骤,或者为了简单起见,可以使用下面的"Andoid.mk“文件

代码语言:javascript
运行
AI代码解释
复制
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
c_includes := $(LOCAL_PATH)
LOCAL_MODULE := libprotobuf       
LOCAL_SRC_FILES := \
        google/protobuf/arena.cc \
        google/protobuf/arenastring.cc \
        google/protobuf/extension_set.cc \    
        google/protobuf/generated_message_util.cc \
        google/protobuf/io/coded_stream.cc \
        google/protobuf/io/zero_copy_stream.cc \
        google/protobuf/io/zero_copy_stream_impl_lite.cc \
        google/protobuf/message_lite.cc \
        google/protobuf/repeated_field.cc \
        google/protobuf/stubs/atomicops_internals_x86_gcc.cc \
        google/protobuf/stubs/atomicops_internals_x86_msvc.cc \
        google/protobuf/stubs/bytestream.cc \
        google/protobuf/stubs/common.cc \
        google/protobuf/stubs/int128.cc \
        google/protobuf/stubs/once.cc \
        google/protobuf/stubs/status.cc \
        google/protobuf/stubs/statusor.cc \
        google/protobuf/stubs/stringpiece.cc \
        google/protobuf/stubs/stringprintf.cc \
        google/protobuf/stubs/structurally_valid.cc \
        google/protobuf/stubs/strutil.cc \
        google/protobuf/stubs/time.cc \
        google/protobuf/wire_format_lite.cc \
        google/protobuf/any.cc \
        google/protobuf/any.pb.cc \
        google/protobuf/api.pb.cc \
        google/protobuf/compiler/importer.cc \
        google/protobuf/compiler/parser.cc \
        google/protobuf/descriptor.cc \
        google/protobuf/descriptor.pb.cc \
        google/protobuf/descriptor_database.cc \
        google/protobuf/duration.pb.cc \
        google/protobuf/dynamic_message.cc \
        google/protobuf/empty.pb.cc \
        google/protobuf/extension_set_heavy.cc \
        google/protobuf/field_mask.pb.cc \
        google/protobuf/generated_message_reflection.cc \
        google/protobuf/io/gzip_stream.cc \
        google/protobuf/io/printer.cc \
        google/protobuf/io/strtod.cc \
        google/protobuf/io/tokenizer.cc \
        google/protobuf/io/zero_copy_stream_impl.cc \
        google/protobuf/map_field.cc \
        google/protobuf/message.cc \
        google/protobuf/reflection_ops.cc \
        google/protobuf/service.cc \
        google/protobuf/source_context.pb.cc \
        google/protobuf/struct.pb.cc \
        google/protobuf/stubs/mathlimits.cc \
        google/protobuf/stubs/substitute.cc \
        google/protobuf/text_format.cc \
        google/protobuf/timestamp.pb.cc \
        google/protobuf/type.pb.cc \
        google/protobuf/unknown_field_set.cc \
        google/protobuf/util/field_comparator.cc \
        google/protobuf/util/field_mask_util.cc \
        google/protobuf/util/internal/datapiece.cc \
        google/protobuf/util/internal/default_value_objectwriter.cc \
        google/protobuf/util/internal/error_listener.cc \
        google/protobuf/util/internal/field_mask_utility.cc \
        google/protobuf/util/internal/json_escaping.cc \
        google/protobuf/util/internal/json_objectwriter.cc \
        google/protobuf/util/internal/json_stream_parser.cc \
        google/protobuf/util/internal/object_writer.cc \
        google/protobuf/util/internal/proto_writer.cc \
        google/protobuf/util/internal/protostream_objectsource.cc \
        google/protobuf/util/internal/protostream_objectwriter.cc \
        google/protobuf/util/internal/type_info.cc \
        google/protobuf/util/internal/type_info_test_helper.cc \
        google/protobuf/util/internal/utility.cc \
        google/protobuf/util/json_util.cc \
        google/protobuf/util/message_differencer.cc \
        google/protobuf/util/time_util.cc \
        google/protobuf/util/type_resolver_util.cc \
        google/protobuf/wire_format.cc \
        google/protobuf/wrappers.pb.cc \
        google/protobuf/compiler/code_generator.cc      \
        google/protobuf/compiler/command_line_interface.cc      \
        google/protobuf/compiler/cpp/cpp_enum.cc      \
        google/protobuf/compiler/cpp/cpp_enum_field.cc      \
        google/protobuf/compiler/cpp/cpp_extension.cc      \
        google/protobuf/compiler/cpp/cpp_field.cc      \
        google/protobuf/compiler/cpp/cpp_file.cc      \
        google/protobuf/compiler/cpp/cpp_generator.cc      \
        google/protobuf/compiler/cpp/cpp_helpers.cc      \
        google/protobuf/compiler/cpp/cpp_map_field.cc      \
        google/protobuf/compiler/cpp/cpp_message.cc      \
        google/protobuf/compiler/cpp/cpp_message_field.cc      \
        google/protobuf/compiler/cpp/cpp_primitive_field.cc      \
        google/protobuf/compiler/cpp/cpp_service.cc      \
        google/protobuf/compiler/cpp/cpp_string_field.cc      \
        google/protobuf/compiler/csharp/csharp_doc_comment.cc      \
        google/protobuf/compiler/csharp/csharp_enum.cc      \
        google/protobuf/compiler/csharp/csharp_enum_field.cc      \
        google/protobuf/compiler/csharp/csharp_field_base.cc      \
        google/protobuf/compiler/csharp/csharp_generator.cc      \
        google/protobuf/compiler/csharp/csharp_helpers.cc      \
        google/protobuf/compiler/csharp/csharp_map_field.cc      \
        google/protobuf/compiler/csharp/csharp_message.cc      \
        google/protobuf/compiler/csharp/csharp_message_field.cc      \
        google/protobuf/compiler/csharp/csharp_primitive_field.cc      \
        google/protobuf/compiler/csharp/csharp_reflection_class.cc      \
        google/protobuf/compiler/csharp    /csharp_repeated_enum_field.cc      \
        google/protobuf/compiler/csharp/csharp_repeated_message_field.cc      \
        google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc      \
        google/protobuf/compiler/csharp/csharp_source_generator_base.cc      \
        google/protobuf/compiler/csharp/csharp_wrapper_field.cc      \
        google/protobuf/compiler/java/java_context.cc      \
        google/protobuf/compiler/java/java_doc_comment.cc      \
        google/protobuf/compiler/java/java_enum.cc      \
        google/protobuf/compiler/java/java_enum_field.cc      \
        google/protobuf/compiler/java/java_enum_field_lite.cc      \
        google/protobuf/compiler/java/java_enum_lite.cc      \
        google/protobuf/compiler/java/java_extension.cc      \
        google/protobuf/compiler/java/java_field.cc      \
        google/protobuf/compiler/java/java_file.cc      \
        google/protobuf/compiler/java/java_generator.cc      \
        google/protobuf/compiler/java/java_generator_factory.cc      \
        google/protobuf/compiler/java/java_helpers.cc      \
        google/protobuf/compiler/java/java_lazy_message_field.cc      \
        google/protobuf/compiler/java/java_lazy_message_field_lite.cc      \
        google/protobuf/compiler/java/java_map_field.cc      \
        google/protobuf/compiler/java/java_map_field_lite.cc      \
        google/protobuf/compiler/java/java_message.cc      \
        google/protobuf/compiler/java/java_message_builder.cc      \
        google/protobuf/compiler/java/java_message_builder_lite.cc      \
        google/protobuf/compiler/java/java_message_field.cc      \
        google/protobuf/compiler/java/java_message_field_lite.cc      \
        google/protobuf/compiler/java/java_message_lite.cc      \
        google/protobuf/compiler/java/java_name_resolver.cc      \
        google/protobuf/compiler/java/java_primitive_field.cc      \
        google/protobuf/compiler/java/java_primitive_field_lite.cc      \
        google/protobuf/compiler/java/java_service.cc      \
        google/protobuf/compiler/java/java_shared_code_generator.cc      \
        google/protobuf/compiler/java/java_string_field.cc      \
        google/protobuf/compiler/java/java_string_field_lite.cc      \
        google/protobuf/compiler/javanano/javanano_enum.cc      \
        google/protobuf/compiler/javanano/javanano_enum_field.cc      \
        google/protobuf/compiler/javanano/javanano_extension.cc      \
        google/protobuf/compiler/javanano/javanano_field.cc      \
        google/protobuf/compiler/javanano/javanano_file.cc      \
        google/protobuf/compiler/javanano/javanano_generator.cc      \
        google/protobuf/compiler/javanano/javanano_helpers.cc      \
        google/protobuf/compiler/javanano/javanano_map_field.cc      \
        google/protobuf/compiler/javanano/javanano_message.cc      \
        google/protobuf/compiler/javanano/javanano_message_field.cc      \
        google/protobuf/compiler/javanano/javanano_primitive_field.cc      \
        google/protobuf/compiler/js/js_generator.cc      \
        google/protobuf/compiler/objectivec/objectivec_enum.cc      \
        google/protobuf/compiler/objectivec/objectivec_enum_field.cc      \
        google/protobuf/compiler/objectivec/objectivec_extension.cc      \
        google/protobuf/compiler/objectivec/objectivec_field.cc      \
        google/protobuf/compiler/objectivec/objectivec_file.cc      \
        google/protobuf/compiler/objectivec/objectivec_generator.cc      \
        google/protobuf/compiler/objectivec/objectivec_helpers.cc      \
        google/protobuf/compiler/objectivec/objectivec_map_field.cc      \
        google/protobuf/compiler/objectivec/objectivec_message.cc      \
        google/protobuf/compiler/objectivec/objectivec_message_field.cc      \
        google/protobuf/compiler/objectivec/objectivec_oneof.cc      \
        google/protobuf/compiler/objectivec/objectivec_primitive_field.cc      \
        google/protobuf/compiler/plugin.cc      \
        google/protobuf/compiler/plugin.pb.cc      \
        google/protobuf/compiler/python/python_generator.cc      \
        google/protobuf/compiler/ruby/ruby_generator.cc      \
        google/protobuf/compiler/subprocess.cc      \
        google/protobuf/compiler/zip_writer.cc      \

LOCAL_CFLAGS := -D GOOGLE_PROTOBUF_NO_RTTI=1
LOCAL_CPPFLAGS := -std=c++11
LOCAL_C_INCLUDES = $(LOCAL_PATH)/android 
LOCAL_C_INCLUDES += ${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.8/include
LOCAL_LDLIBS += -lz
LOCAL_EXPORT_LDLIBS += -lz
LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
LOCAL_EXPORT_CPPFLAGS := $(LOCAL_CPPFLAGS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
include $(BUILD_SHARED_LIBRARY)

步骤3:需要向Android.mk添加波纹图标志的

LOCAL_CFLAGS += $(cf_includes) -DGOOGLE_PROTOBUF_NO_RTTI

参考链接Android独立工具链

使用上述步骤可以解决此问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37163821

复制
相关文章
GitHub 如何从特定的版本中创建分支
在 Git 的操作中,我们可能需要从特定的版本中创建分支。 首先需要的第一步是活的当前项目的提交历史列表。 然后在特定的版本后,选择 <> 标记,进入这个版本的提交历史。 在左上角上,选择提交历史。 在弹出的对话框中输入分支名称。 在你输入名称后,将会提示你创建分支。 这个的意思是从当前的提交版本中创建一个分支。 然后可以从上面的提交中创建一个分支。 在创建完成后,可以从分支列表中查看创建的分支列表。 https://www.ossez.com/t/github/13414
HoneyMoose
2021/04/02
6.9K0
GitHub 如何从特定的版本中创建分支
tar压缩时排除特定文件和文件夹
一日一技是一个每天更新的栏目,力图做到让你每天用2分钟的时间掌握一个开发技巧。 ---- tar压缩文件的时候排除特定文件和文件夹: tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz . 注意末尾有一个点。
青南
2018/10/18
1.7K0
如何使用CP / SCP / RSYNC在Linux中排除特定目录?
对于任何系统管理员或一般Linux操作系统用户而言,在服务器之间执行文件复制操作都是一项常见任务。在将文件从一个系统复制到另一个系统时,由于某些特定原因,我们可能需要排除某些文件和目录被复制。即使在同一系统上将数据从一个位置传输到另一位置时,这也可能适用。
用户6543014
2020/05/04
15.7K0
meteor 简介
“Meteor gives you a radically simpler way to build realtime mobile and web apps, entirely in JavaScript from one code base.”
IMWeb前端团队
2019/12/04
9220
meteor 简介
meteor 简介
本文作者:IMWeb helondeng 原文出处:IMWeb社区 未经同意,禁止转载 What “Meteor gives you a radically simpler way to b
IMWeb前端团队
2018/01/08
1.4K0
meteor 简介
Meteor Tupperware — 更精简的Meteor Docker镜像
meteor-tupperware是一款更为精简的、适用于生产环境的Meteor Docker镜像。我们只需要两分钟就能快速部署应用! 假设你已经安装了Docker并且运行它: 创建 Dockerfile 和 .dockerignore (从 README 复制粘贴即可) 运行 docker build -t yourapp . 你也可以配置它同ImageMagick或PhantomJS协作,如果你的应用依赖它们的话。 相比于之前提到的meteord,它们有如下区别: meteor-tupperware
时见疏星
2018/06/01
5010
如何Meteor中轻松使用Webpack
原文来自Meteor Forum,更多讨论点击「阅读原文」进行查看! Meteor是一套惊人的工具来高效地创建伟大的Web应用。我非常喜爱它。这也是我半年前创建了一个能让Webpack集成进Meteor的扩展包。我觉得如果我们能有一个实时热重载,ES6模块,资源打包和代码分离,这会让Meteor更加酷,并且我们做到了! 但有件事我并不是很高兴,那就是配置Webpack太难了。你需要学习一系列新的概念才能写webpack.config.js。我不喜欢那些文件,因为不管你做的东西多么简单,配置它们都相当麻烦。
时见疏星
2018/06/01
1.1K0
Netty中的引导类Bootstrap
Bootstrap是用来组织Netty的各个结构(pipeline,handler,eventloop),并使他们运行起来的类结构。分成两块,一个是客户端引导类Bootstrap,只用1个channel来处理所有的网络交互,另一个是服务端的ServerBootstrap,它提供一个父channel来接受客户端的请求,然后父channel创建多个子channel来用于的通信
爬蜥
2019/07/09
9570
Git 如何从特定的提交中创建一个新的分支
通过在提交历史中单击右键,然后选择分支,你就可在当前指定的提交历史中来创建一个新的分支了。
HoneyMoose
2022/06/04
6.8K0
Git 如何从特定的提交中创建一个新的分支
WordPress 技巧:如何从 WordPress 页面菜单中移除特定页面
从 wp_list_pages() 中生成的页面菜单中移除特定的页面是非常简单的,只需要把下面代码加入到主题的 functions.php 文件中:
Denis
2023/04/15
2K0
Redis进阶-如何从海量的 key 中找出特定的key列表 & Scan详解
假设你需要从 Redis 实例成千上万的 key 中找出特定前缀的 key 列表来手动处理数据,可能是修改它的值,也可能是删除 key。那该如何从海量的 key 中找出满足特定前缀的 key 列表来?
小小工匠
2021/08/17
4.7K0
浏览器实验中的故障排除
https://webrtchacks.com/troubleshooting-unwitting-browser-experiments-al-brooks/
LiveVideoStack
2021/09/01
2.7K0
WordPress 技巧:从搜索结果中排除页面
默认情况下,WordPress 搜索结果显示发布的文章和页面,如果想把页面从 WordPress 搜索结果中排除,可以在当前主题的 functions.php 文件中添加如下的函数:
Denis
2023/04/13
4820
Blazor 中的路由和路由模板
过去的 ASP.NET Web 窗体和现代 Web 明显区别在于 Web 服务器入口是否存在路由组件。在 Web 窗体中,绝大多数 Web 终结点都是物理文件资源,直接通过其页面路径调用。
AI.NET 极客圈
2019/08/16
8.5K0
Egg 中的路由
在上面的路由中只插入了一个中间件,业务复杂时,还可以插入多个中间件,前提是要把用到的中间件全部引入。
越陌度阡
2020/11/26
1.7K0
Egg 中的路由
meteor框架学习
meteor js的全栈开发框架,官方的解释: Meteor makes it an order of magnitude simpler, and a lot more fun. You can b
用户1141560
2017/12/26
1.3K0
meteor框架学习
npm 中如何下载特定的组件版本
IMWeb前端团队
2018/01/08
4.3K0
npm 中如何下载特定的组件版本
ICCII中如何保持特定module的port
在进行后端设计时,为了使得最终的结果更加优化,也就是面积,功耗,性能更好,工具在优化时可能会把module的port改变。但是这样可能会带来一些问题。问题之一就是前端在进行仿真的时候,由于某些module port找不到了,很难找到需要监测的信号。
白山头
2020/09/15
2.7K0
点击加载更多

相似问题

成员从特定路由中排除混入

13

从Vue.js中的某些路由中排除引导样式

22

Symfony -从安全路径中排除特定路由

21

Meteor中的路由

31

路由regex要求:排除特定的单词

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文