在 Android 的 java 层往 native 层的一个 service 传输一个 protobuf 的字符串: 首先 proto 文件( information )很简单:
syntax = "proto2";
option optimize_for = LITE_RUNTIME;
message info {
optional int32 member = 1;
}
mk 里面分别编译了 java 库和 c++库:
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(call all-proto-files-under, proto) \
LOCAL_MODULE := xxx
LOCAL_MODULE_TAGS := optional
LOCAL_VENDOR_MODULE := true
#LOCAL_PROTOC_OPTIMIZE_TYPE := nano
LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/
LOCAL_SHARED_LIBRARIES := liblog
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(call all-proto-files-under, proto) \
LOCAL_MODULE := xxx.aaa.bbb
LOCAL_MODULE_TAGS := optional
LOCAL_VENDOR_MODULE := true
#LOCAL_PROTOC_OPTIMIZE_TYPE := nano
LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/
include $(BUILD_STATIC_JAVA_LIBRARY)
在 java 层时这么塞数据的:
information.info data = information.info();
data.member = 150;
String buf = new String(information.info.toByteArray(data));
//然后通过 hidl 接口传过去
在 c++层这么解数据的:
info data;
data.ParseFromString(buf);
现在问题是,当我在 info 的 member 赋值 127 以上的数字时,就会出错,c++层解析出来变成 2 万多,127 或以下的值就没有问题。是我在塞数据的时候用错了吗?
(还有一点 proto 文件自动生成的 java 文件是继承的 messagenano,而生成的 c++代码继承的是 messagelite,这两个好像不一样啊)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.