翻译参考

类型

  • 对于基元类型,J2ObjC 定义了 JNI 样式的类型定义符。
  • 对于典型的类类型,软件包采用驼峰式大小写形式,并加在类名称前面。
  • 对于基本对象类型和所有类型变量,则为“id”。
  • 一些核心 Java 类型会映射到基础类型。(例如String 转换为 NSString)
  • 对于声明为“volatile”的字段,J2ObjC 具有更多使用 C11 _Atomic(...) 类型的类型定义符。
  • 对于内部类型,内部类名称会通过下划线附加到外部名称后面。
Java 类型 Objective-C 类型 Objective-C 易失性类型
布尔值 j 布尔值 volatile_jboolean
char Jchar volatile_jchar
字节 JB volatile_jbyte
短片 Jshort volatile_jshort
int Jint volatile_jint
long jlong volatile_jlong
float jfloat volatile_jfloat
double jdouble volatile_jdouble
java.lang.Object id volatile_id
类型变量 id volatile_id
java.lang.String NSString* volatile_id
java.lang.Number NSNumber* volatile_id
java.lang.Cloneable NScopy* volatile_id
foo.bar.Mumble FooBarMumble* volatile_id
foo.bar.Mumber$Inner FooBarMumble_Inner* volatile_id

方法

Objective-C 方法与 Java 方法有两点不同。它们在语法上 将参数嵌入到方法选择器的组件之间。Objective-C 方法不像 Java 那样支持过载。这些差异可以通过将 参数类型传递到生成的选择器中。这样可以防止在 Google Analytics 之间 重载的 Java 方法。

生成的 API 中有三种不同的 Java 方法:实例方法、静态方法 方法和构造函数。实例方法会转换为 Objective-C 实例方法。静态 方法和构造函数可转换为 C 语言函数,但还会将 Objective-C 封装容器添加到 为 Objective-C 开发者提供更熟悉的 API。

实例方法

方法名称的生成方式如下:

  • 零参数方法保持不变
  • 一个或多个参数使用以下模式: <ph type="x-smartling-placeholder">
      </ph>
    • <java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
  • 参数关键字规则: <ph type="x-smartling-placeholder">
      </ph>
    • 对于基元类型,关键字是 Java 基元的大写名称。(例如“Char”
    • 对于非基元类型,关键字为完全限定类型名称(采用驼峰命名法)。(例如“ComGoogleFoo”)
    • 对于数组类型,“数组”会附加到元素类型的关键字。
Java 示例
interface Foo {
  void bar();
  String bar(int i);
  java.util.List bar(String s, long[] l);
}
Objective-C 示例
- (void)bar;

- (NSString *)barWithInt:(jint)i;

- (id<JavaUtilList>)barWithNSString:(NSString *)s
                      withLongArray:(IOSLongArray *)l;

静态方法

添加 Objective-C 类方法时,遵循与实例方法相同的命名规则。

使用以下命名规则添加 C 样式的函数:

  • 从生成的 Objective-C 选择器开始。(例如barWithInt:)
  • 将冒号替换为下划线。(例如barWithInt_)
  • 请在类名称前面加上以下划线分隔。(例如ComGoogleFoo_barWithInt_)
Java 示例
package com.google;
class Foo {
  static boolean bar() { ... }
  static double bar(int[] i) { ... }
  static void bar(String s, boolean b) { ... }
}
Objective-C 示例
@interface Foo : NSObject

+ (jboolean)bar;

+ (jdouble)barWithIntArray:(IOSIntArray *)i;

+ (void)barWithNSString:(NSString *)s
            withBoolean:(jboolean)b;

@end

FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();

FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);

FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);

构造函数

按照 Objective-C 惯例,添加了一个 init 实例方法。如果构造函数包含 参数,则使用与实例方法相同的命名规则。

添加了三个 C 样式的函数:

  • 第一个函数接受新分配的对象作为其第一个参数。此函数 通常用于从子类构造函数进行调用。这遵循与静态变量相同的命名规则 方法。(其中“init”是方法名称)
  • 添加了两个函数,用于分配和初始化新对象。它们区分开来 前缀: <ph type="x-smartling-placeholder">
      </ph>
    • create_ 函数将返回一个自动释放的对象。
    • new_ 函数将返回保留的对象。
Java 示例
package com.google;
class Foo {
  Foo() { ... }
  Foo(Object a, Object b) { ... }
}
Objective-C 示例
@interface ComGoogleFoo : NSObject

- (instancetype)init;

- (instancetype)initWithId:(id)a
                    withId:(id)b;

@end

FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);

FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;

FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();

FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);

FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;

FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);

字段

实例字段(非静态)

Java 实例变量变为 Objective-C 实例变量。名称相同,结尾是 下划线。原始字段声明为“final”是一种特殊情况,不会转化为实例 变量。

  • 使用“->”可以直接访问字段语法。
  • 原初字段可以直接设置。
    • 最终基元(常量)会像静态常量一样进行转换。(请参阅静态字段
  • 非基元字段必须使用提供的 setter 函数进行设置: <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_set_fieldName_(instance, value)
Java 示例
package com.google;
class Foo {
  public int myInt;
  public String myString;
}
Objective-C 示例
Foo *foo = [[Foo alloc] init];

// Access a primitive field.
i = foo->myInt_;

// Set a primitive field.
foo->myInt_ = 5;

// Access a non-primitive field.
NSString *s = foo->myString_;

// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");

静态字段

静态变量必须使用提供的 getter 和 setter 函数进行访问。 这些访问器函数可确保在访问变量之前进行类初始化。

  • 访问静态字段 <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_get_fieldName()
  • 分配(非最终)静态字段 <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_set_fieldName()
  • 获取指向基元静态字段的指针 <ph type="x-smartling-placeholder">
      </ph>
    • ClassName_getRef_fieldName()
    • 仅适用于非最终字段和非易失性字段。

最终基元字段(常量)可以直接安全访问,因为它们的值不依赖于类初始化。

  • ClassName_fieldName
Java 示例
package com.google;
class Foo {
  public static final MY_FINAL_INT = 5;
  public static int myInt;
  public static String myString;
}
Objective-C 示例
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT;   // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT();  // Class initialization

// Access a primitive field.
i = ComGoogleFoo_get_myInt();

// Set a primitive field.
ComGoogleFoo_set_myInt(5);

// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();

// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");

枚举

J2ObjC 会为每个 Java 枚举生成两种类型。生成一个 Objective-C 类类型,该类型可提供 Java 枚举的完整功能。此外,使用 Foundation 生成 C 枚举 框架的 NS_ENUM 宏。所有生成的 API 都会使用 Objective-C 类类型。C 枚举是 可用作 switch 语句的常量值或存储类型。

生成的枚举类型命名如下:

  • Objective-C 类的命名规则与常规 Java 类的命名规则相同。(请参阅类型
  • C 枚举被命名为常规 Java 类,并添加了“_Enum”后缀。

枚举常量的访问方式与静态字段相同。

Java 示例
package com.google;
enum Color {
  RED, GREEN, BLUE
}
Objective-C 标头示例
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
  ComGoogleColor_Enum_RED = 0;
  ComGoogleColor_Enum_GREEN = 1;
  ComGoogleColor_Enum_BLUE = 2;
};

@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end

inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();

// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);