如何将GoogleProtobuf创建的java代码构建、集成和编译到Android Studio项目中

如何将GoogleProtobuf创建的java代码构建、集成和编译到Android Studio项目中,java,android-studio,maven-3,protocol-buffers,Java,Android Studio,Maven 3,Protocol Buffers,我一直在试图找到一种方法,将google protobuf的protoc编译器生成的java代码集成到Android Studio项目中 protoc --java_out=. Navigation.proto 其中Navigation.proto包含: syntax = "proto3"; option java_generic_services = true; message Navigation { string name = 1; string url = 2; }

我一直在试图找到一种方法,将google protobuf的protoc编译器生成的java代码集成到Android Studio项目中

protoc --java_out=.  Navigation.proto
其中Navigation.proto包含:

syntax = "proto3";
option java_generic_services = true;
message Navigation {
    string name = 1;
    string url = 2;
} 

service NavRPC {
    rpc putNavigation(Navigation) returns (Navigation);                                                                                                   
};    
将生成一个java类(Navigation.java),但该类引用的包不在Android Studio中的库列表(应用程序或外部)中

我尝试在Android Studio中通过Project Structure的dependencies选项卡从maven central安装库,但不断收到错误消息,包括:

Error:(116, 79) error: incompatible types: IOException cannot be converted to String
Error:(261, 36) error: cannot find symbol method parseWithIOException(Parser<NavDrawerElement>,InputStream)
Error:(266, 36) error: cannot find symbol method parseWithIOException(Parser<NavDrawerElement>,InputStream,ExtensionRegistryLite)
Error:(269, 36) error: cannot find symbol method parseDelimitedWithIOException(Parser<NavDrawerElement>,InputStream)
Error:(274, 36) error: cannot find symbol method parseDelimitedWithIOException(Parser<NavDrawerElement>,InputStream,ExtensionRegistryLite)
Error:(278, 36) error: cannot find symbol method parseWithIOException(Parser<NavDrawerElement>,CodedInputStream)
错误:(116,79)错误:不兼容的类型:IOException无法转换为字符串
错误:(261,36)错误:找不到符号方法parseWithIOException(解析器,InputStream)
错误:(266,36)错误:找不到符号方法parseWithIOException(解析器、InputStream、ExtensionRegistryLite)
错误:(269,36)错误:找不到符号方法parseDelimitedWithIOException(解析器,InputStream)
错误:(274,36)错误:找不到符号方法parseDelimitedWithIOException(解析器、InputStream、ExtensionRegistryLite)
错误:(278,36)错误:找不到符号方法parseWithIOException(解析器,CodedInputStream)

由于对Java、Android Studio和Maven有些陌生,我不知道为什么会发生这些错误。这些库显示在external libraries列表中,但我不断得到未解决的依赖项和错误,这似乎表明情况并非如此。

我发现一个真正适合我的解决方案是构建google protobuf jar文件,然后添加到我的项目库中

要在MacOS中构建这些jar文件,必须正确安装、配置和设置几种技术/软件包

JDK1.8 在MacOSX中有一个实用程序(/usr/libexec/java_home),可以 用于生成正确的JAVA_HOME环境变量

我修改了.bashrc文件以包括:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
如果系统上安装的MacOSX版本基于10.6, 那么默认的jdk版本是1.6。java和jdk的新版本 可以从system preferences/java/java小程序安装,但是 一旦安装,仍然需要将JAVA_HOME设置为point 要使用的版本

这是因为mac上可以存在多个java版本 更新实用程序不会尝试猜测您是否需要更新 最新版本

Maven 3.3.8 我使用MacPorts安装maven3。在 安装maven3时,我必须更新端口和所有相关的 打包以消除[关于过期的]警告 软件包]

我试图用“sudo端口”进行更新安装,但没有成功 遇到问题。所以我最终使用了sudobash

执行的命令:

sudo bash
ports selfupdate
ports install maven3
ports update
mvn3 install
mvn3 package
谷歌协议 我从谷歌下载了protobuf master并构建了protoc

我不明白为什么我希望构建jar文件 没有,这是导致安装和更新的原因(如上)

一旦安装了正确的jdk和maven,我就能够 切换到java目录并安装maven3

执行的命令:

sudo bash
ports selfupdate
ports install maven3
ports update
mvn3 install
mvn3 package
我不知道安装和软件包之间是否/有什么区别- 但两个都跑似乎没有什么坏处

编译.proto文件 我使用了一个简单的.proto文件,其中包含多种消息类型和 RPC服务的定义:

syntax = "proto3";
option java_generic_services = true;
message Navigation {
    string name = 1;
    string url = 2;
};

service NavRPC {
    rpc putMessage(Navigation) returns (Navigation);
}
编撰 安卓工作室 为了获得要编译的协议缓冲区生成类:

我已将这些文件复制到我的lib目录中:

protobuf-master/java/core/target/protobuf-java-3.0.0-beta-2.jar
protobuf-master/java/util/target/protobuf-java-util-3.0.0-beta-2.jar
复制这些文件后,我必须输入源文件要添加到的包的名称

我还有一些问题(比如如何制作Android)
Studio自动调用编译.proto文件),但一切都正常

感谢您与我们分享您的经验。我建议你删除当前的问题内容(关于你为什么发布Q&A的序言),并用你遇到的实际问题替换它,包括你尝试过的不起作用的问题。然后,您可以从答案中编辑该信息,然后答案内容将更简洁地描述解决方案。这种格式还允许其他人提出替代解决方案,并允许我们的主持人更好地确定这个问题是否(例如)重复。我认为这样更好!感谢您的回答,顺便说一句,在您的项目中自动编译您可以使用的原型文件