下面的快速示例演示了如何在项目中添加协议缓冲区。
以下是一个简单的协议缓冲区定义 geo.proto
:
syntax = "proto2";
message Location {
optional string name = 1;
optional double latitude = 2;
optional double longitude = 3;
}
我们的主 Java 程序 Hello.java
:
class Hello {
public static void main(String[] args) {
Geo.Location.Builder locationBuilder = Geo.Location.newBuilder();
locationBuilder.setName("CN Tower");
locationBuilder.setLatitude(43.6412172);
locationBuilder.setLongitude(-79.3884058);
Geo.Location location = locationBuilder.build();
System.out.println(location.toString());
}
}
首先,设置一些“项目”:
export J2OBJC_HOME=~/j2objc # Change to where the j2objc distribution was unzipped.
ls $J2OBJC_HOME/j2objc # Fix above definition until this command works.
mkdir java objc classes # Output directories
接下来,使用 j2objc_protoc
生成协议缓冲区。使用 --java_out
生成 Java 代码,通过 --j2objc_out
生成 Objective-C 代码。每个标志指定的值是目标语言的输出目录。可在同一命令中生成这两种输出语言。
$J2OBJC_HOME/j2objc_protoc --java_out=java --j2objc_out=objc geo.proto
ls java Geo.java
ls objc Geo.h Geo.m
需要编译生成的 Java proto 文件,以便解析 Hello
中对它们的引用。这是使用 javac
完成的,因此它们不会在接下来的步骤中转换为目标 C。
javac -source 1.8 -target 1.8 -bootclasspath $J2OBJC_HOME/lib/jre_emul.jar -cp $J2OBJC_HOME/lib/protobuf_runtime.jar -d classes java/*.java
ls classes/ Geo$1.class Geo$Location$Builder.class Geo$LocationOrBuilder.class Geo$Location$1.class Geo$Location.class Geo.class
照常转换 Java 源代码,将编译后的 Java proto 添加到类路径中。
$J2OBJC_HOME/j2objc -cp classes:$J2OBJC_HOME/lib/protobuf_runtime.jar -d objc Hello.java
ls objc Geo.h Geo.m Hello.h Hello.m
现在,我们可以编译和关联所有的 Objective-C 源代码。您需要与 libprotobuf_runtime.a 库建立关联,才能添加 protobuf 运行时。
$J2OBJC_HOME/j2objcc -lprotobuf_runtime -o hello objc/*.m
./hello Hello name: "CN Tower" latitude: 43.6412 longitude: -79.3884