การใช้บัฟเฟอร์โปรโตคอล

ตัวอย่างสั้นๆ เพื่อสาธิตวิธีการเพิ่มบัฟเฟอร์โปรโตคอลในโปรเจ็กต์

ต่อไปนี้เป็นคําจํากัดความบัฟเฟอร์โปรโตคอลที่เรียบง่ายชื่อ 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 ด้วย --java_out และโค้ด Objective-C ด้วย --j2objc_out ค่าที่ระบุโดยแฟล็กแต่ละรายการคือไดเรกทอรีเอาต์พุตสําหรับภาษาเป้าหมาย โดยสร้างเอาต์พุตทั้ง 2 ภาษาได้ในคําสั่งเดียวกัน

$J2OBJC_HOME/j2objc_protoc --java_out=java --j2objc_out=objc geo.proto
ls java
Geo.java
ls objc
Geo.h Geo.m

จําเป็นต้องรวบรวมไฟล์ต้นแบบ Java ที่สร้างขึ้นเพื่อให้การอ้างอิงไปยังไฟล์ดังกล่าวใน 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