Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当解析字符串数据时,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

复制
相关文章
Java中子类和父类的构造函数?
当继承父类时,构造对象时,父类中的构造函数(super())首先被调用。如果没有,编译器会插入调用父类构造的语句。这就是为什么在创建子类对象时父类中的构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。让父类中的构造器被调用的原因是,如果父类有私有的属性需要在它的构造函数中初始化。  经过编译器插入父类构造函数,子类的构造函数如下所示:
用户7886150
2020/12/08
2.4K0
python的子类继承父类构造函数说明
如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。
狼啸风云
2019/09/18
2.9K0
创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?
问题:为什么创建A对象的时候父类会调用子类方法? 但是:创建B对象父类会调用父类的方法?
zhangheng
2020/04/28
6.7K0
【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
0 . 类继承格式 : 使用 " : " 继承父类 ; 如果该父类有主构造函数 , 那么子类必须至少有一个主构造函数或次构造函数 , 子类的构造函数下面会根据不同情况详细解析 ;
韩曙亮
2023/03/27
1.4K0
【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )
构造函数调用子类的方法,写过吗?
这段示例代码,类Derive派生于Base,Base的构造函数与虚构函数均调用虚函数GetValue(),根据C++多态特性,应该是要调用Derive的GetValue()返回2,真的是这样吗?让我们看下最终的输出。
gaigai
2021/04/13
1.6K0
构造函数调用子类的方法,写过吗?
小朋友学C++(10):子类构造函数调用父类构造函数
从哲学层面来看,子类会继承父类除private以外的所有成员。 因为构造函数是公有的,所以理所当然地会被子类继承。 程序1: #include <iostream> using namespace std; class Shape { public: Shape() { cout << "Shape's constructor method is invoked!\n"; } }; class Rectangle : public Shape { public:
海天一树
2018/04/17
1.6K0
【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )
在 Kotlin 类中 , 可以在 类声明 时 在 类名后 定义 " 主构造函数 " ;
韩曙亮
2023/03/30
5.3K0
解析C#类中的构造函数
彭泽0902
2018/01/04
3.6K0
反射类的构造函数
<!-- 首先,通过Class获取类的字节码 Class clazz = Class.forName("com.marer.reflect.Person"); 然后,利用Constructor创建对象 Constructor c = clazz.getConstructor(null);//获取无参的构造函数 Constructor c = clazz.getConstructor(String.class);//获取参数为String的构造函数 Constructor c = clazz.getConstructor(String.class, int.class);//获取参数为String,int的构造函数 Constructor c = clazz.getDeclaredConstructor(List.class);//获取隐藏为private的构造函数 c.setAccessible(true);//暴力反射 创建对象的另外一种途径,反射出类的无参构造函数并创建对象 Class clazz = Class.forName("com.marer.reflect.Person"); Person p = (Person) clazz.newInstance(); 但是当无参的构造函数为private或不存在的时候,反射抛异常 转载请注明出处:http://blog.csdn.net/nthack5730/article/details/49822819 但是可以通过暴力反射获取类的隐藏构造函数: Constructor.setAccessible(true);
MonroeCode
2018/01/11
1.2K0
Python 类的构造函数
类的构造函数 类中的一种默认函数,用来将类实例化的同时, 将参数传入类中 构造函数的创建 def __init__(self, a, b) self.a = a self.b = b 代码 # coding:utf-8 def sleep(name): return name class Person(object): def __init__(self, name, age=None): self.name = name self.age =
Zkeq
2022/05/18
1.5K0
确定聚类算法中的超参数
聚类是无监督学习的方法,它用于处理没有标签的数据,功能强大,在参考资料 [1] 中已经介绍了几种常用的算法和实现方式。其中 K-均值(K-Means)算法是一种常用的聚类方法,简单且强大。
老齐
2022/12/09
3.6K0
确定聚类算法中的超参数
子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
用户9854323
2022/06/25
2.3K0
5.1 类、超类和子类
5.1 类、超类和子类   子类比超类拥有的功能更加丰富。   在本例中,Manager类比超类Employee封装了更多的数据,拥有更多的功能。   在Manager类中,增加了一个用于存储奖金信息的域,以及一个用于设置这个域的方法: class Manager extends Employee { private double bonus; ... public void setBouns(double b) { bonus = b; }
Mister24
2018/05/14
1.1K0
java之父类中的构造器是否能被子类继承?
子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器。子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器。如果父类的构造器被重载,那么子类中的构造器也必须初始化父类的构造器,否则会报编译错误。当然,只要父类中显示定义了空构造器,子类中就不必初始化父类的构造器。例如: 父类Person.java
西西嘛呦
2020/08/26
1.3K0
面试题4(父类构造函数是优先于子类构造函数运行吗)
下面程序代码运行结果是什么? class MyTest extends Test { public MyTest() { system.out.printin("S2"); public class
Java学习
2018/04/18
7040
C++带参数的构造函数 | 有参构造函数
在C++中,程序员希望对不同的对象赋予不同的初值,可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数, 以实现不同的初始化。
小林C语言
2021/01/28
4.3K0
C++带参数的构造函数 | 有参构造函数
C++中类的构造函数和析构函数
构造函数 对象创建的时候执行 student s //空参构造函数 栈内存中 student s("测试")//带参构造函数 栈内存中 或者 student *s=new student//空参构造函
乱码三千
2021/07/29
2.2K0
C++中类的构造函数和析构函数
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.8K0
dart系列之:dart类中的构造函数
dart作为一种面向对象的语言,class是必不可少的。dart中所有的class,除了Null都继承自Object class。 要想使用dart中的类就要构造类的实例,在dart中,一个类的构造函数有两种方式,一起来看看吧。
程序那些事
2021/11/14
3.5K0
点击加载更多

相似问题

子类构造函数是否需要超类构造函数的所有参数?

33

超类和子类中的构造函数

67

关于子类构造函数中的超类?

10

部分模拟子类的方法使其绕过超类构造函数。

11

从超类的构造函数中调用子类的构造函数

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档