使用通訊協定緩衝區

以下示範如何在專案中納入通訊協定緩衝區。

以下是簡單的通訊協定緩衝區定義 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 原型新增至類別路徑。

$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