如何将GoogleProtobuf创建的java代码构建、集成和编译到Android Studio项目中
我一直在试图找到一种方法,将google protobuf的protoc编译器生成的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; }
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的序言),并用你遇到的实际问题替换它,包括你尝试过的不起作用的问题。然后,您可以从答案中编辑该信息,然后答案内容将更简洁地描述解决方案。这种格式还允许其他人提出替代解决方案,并允许我们的主持人更好地确定这个问题是否(例如)重复。我认为这样更好!感谢您的回答,顺便说一句,在您的项目中自动编译您可以使用的原型文件