本文整理了再在Mac上安装Protobuf 和编译Java的详细过程
- 在Mac上安装protobuf
- 创建一个java项目,编写.proto文件
- 用protobuf编译生成java文件,测试
- 用wire编译生成java文件,测试
Github:https://github.com/google/protobuf
我先下载了2.6.1版本的,安装了之后protoc命令报一个错
- dyld: Library not loaded: /usr/local/lib/libprotobuf.9.dylib
安装过程:
解压压缩包
cd到brotofbuf-2.5.0 目录
指定安装目录 ./configure --prefix=/User/Dev/Tools/protobuf /User/Dev/Tools/protobuf安装目录
安装 make
make install
环境变量 sudo vi .bash_profile
- export PROTOBUF=/Users/mingwei/Dev/protobuf
- export ANDROID_HOME=/Users/mingwei/Dev/android-sdk-mac/platform-tools
- export PATH=${PATH}:$ANDROID_HOME:$PROTOBUF/bin
测试 protoc --version
参考:http://my.oschina.net/KingPan/blog/283881?fromerr=8vajR5S9
2.可以自己写,也可以复制example中的文件过来
protobuf.proto
- option java_package = "com.example.demo";
- option java_outer_classname = "PersonPb";
- message Person {
- required string name = 1;
- required int32 id = 2;
- optional string email = 3;
- enum PhoneType {
- MOBILE = 0;
- HOME = 1;
- WORKE = 2;
- }
- message PhoneNumber {
- required string number = 1;
- optional PhoneType type = 2 [default = HOME];
- }
- repeated PhoneNumber phone = 4;
- message CountryInfo {
- required string name = 1;
- required string code = 2;
- optional int32 number = 3;
- }
- }
- message AddressBook {
- repeated Person person = 1;
- }
3.编译生成Java protoc -I=src/main/resource/proto --java_out=src/main/java src/main/resource/proto/protobuf.proto
PersonPb.java
- private PersonPb() {}
- public static void registerAllExtensions(
- com.google.protobuf.ExtensionRegistry registry) {
- }
- public interface PersonOrBuilder
- extends com.google.protobuf.MessageOrBuilder {
- // required string name = 1;
- /**
- * <code>required string name = 1;</code>
- */
- boolean hasName();
- ...
- ...内容很多,(稍后附件中有)
- ...
- com.google.protobuf.Descriptors.FileDescriptor
- .internalBuildGeneratedFileFrom(descriptorData,
- new com.google.protobuf.Descriptors.FileDescriptor[] {
- }, assigner);
- }
- // @@protoc_insertion_point(outer_class_scope)
- }
使用:
- public class MainTest {
- public static void main(String[] args) {
- System.out.println("Test_Systemout");
- PersonPb.AddressBook.Builder build = PersonPb.AddressBook.newBuilder();
- PersonPb.Person person1 = PersonPb.Person.newBuilder().setId(1).setName("xxxxxxi").setEmail("[email protected]").
- addPhone(PersonPb.Person.PhoneNumber.newBuilder().setNumber("15211112222").setType(PersonPb.Person.
- PhoneType.HOME).build()).build();
- build.addPerson(person1);
- PersonPb.Person person2 = PersonPb.Person.newBuilder().setId(2).setName("sasasasas").setEmail("[email protected]").
- addPhone(PersonPb.Person.PhoneNumber.newBuilder().setNumber("15211112222").setType(PersonPb.Person.
- PhoneType.HOME).build()).build();
- build.addPerson(person2);
- for (int i = 0; i < build.getPersonList().size(); i++) {
- System.out.println("name=" + build.getPersonList().get(i).getName());
- }
- }
- }
生成的PersonPb.java 代码加注释一共3600多行,如果代码一多对于移动端显然是一个负担。so...应用而生的Wire就来了,Wire是一个专门针对Android端的轻量级的protobuf。
参考:http://www.bubuko.com/infodetail-781200.html
Github:https://github.com/square/wire
4.使用wire
在gradle中添加wire所需的jar包
- compile 'com.squareup.wire:wire-runtime:2.1.0'
wire-compiler-1.8.0-jar-with-dependencies.jar (稍后附件中有)
wire的文档中写道用命令:
java -jar wire-compiler-1.7.0-jar-with-dependencies.jar --proto_path=. --java_out=. addressbook.proto
可以生成java文件,但是我敲的时候不报错,也不生成任何文件,没找到原因。
然后采用了这种方式
可以生成java文件,但是我敲的时候不报错,也不生成任何文件,没找到原因。
然后采用了这种方式
- task generateWireFile(type: JavaExec ) {
- classpath = files("libs/wire-compiler-1.8.0-jar-with-dependencies.jar")
- args = ["--proto_path=src/main/resource/proto", "--java_out=src/main/java",
- "protobuf.proto"]
- main = "com.squareup.wire.WireCompiler"
- }
在Gradle中添加:
然后双击图中选中的那一项等待编译完成就可以了
生成 Person.java AddressBook.java
demo:http://download.csdn.net/detail/u013045971/9419552