Index: docs/android_accessing_cpp_enums_in_java.md |
diff --git a/docs/android_accessing_cpp_enums_in_java.md b/docs/android_accessing_cpp_enums_in_java.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0fb3729c492f2d6a68dee4d11e2630d9bd0b6fff |
--- /dev/null |
+++ b/docs/android_accessing_cpp_enums_in_java.md |
@@ -0,0 +1,150 @@ |
+# Accessing C++ Enums In Java |
+ |
+[TOC] |
+ |
+## Introduction |
+ |
+Accessing C++ enums in Java is implemented via a Python script which analyzes |
+the C++ enum and spits out the corresponding Java class. The enum needs to be |
+annotated in a particular way. By default, the generated class name will be the |
+same as the name of the enum. If all the names of the enum values are prefixed |
+with the MACRO\_CASED\_ name of the enum those prefixes will be stripped from |
+the Java version. |
+ |
+## Features |
+* Customize the package name of the generated class using the |
+`GENERATED_JAVA_ENUM_PACKAGE` directive (required) |
+* Customize the class name using the `GENERATED_JAVA_CLASS_NAME_OVERRIDE` |
+directive (optional) |
+* Strip enum entry prefixes to make the generated classes less verbose using |
+the `GENERATED_JAVA_PREFIX_TO_STRIP` directive (optional) |
+* Supports |
+[`@IntDef`](https://developer.android.com/reference/android/support/annotation/IntDef.html) |
+* Copies comments that directly preceed enum entries into the generated Java |
+class |
+ |
+## Usage |
+ |
+1. Add directives to your C++ enum |
+ |
+ ```cpp |
+ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome |
+ // GENERATED_JAVA_CLASS_NAME_OVERRIDE: FooBar |
+ // GENERATED_JAVA_PREFIX_TO_STRIP: BAR_ |
+ enum SomeEnum { |
+ BAR_A, |
+ BAR_B, |
+ BAR_C = BAR_B, |
+ }; |
+ ``` |
+ |
+2. Add a new build target |
+ |
+ ``` |
+ import("//build/config/android/rules.gni") |
+ |
+ java_cpp_enum("foo_generated_enum") { |
+ sources = [ |
+ "base/android/native_foo_header.h", |
+ ] |
+ } |
+ ``` |
+ |
+3. Add the new target to the desired android_library targets srcjar_deps: |
+ |
+ ``` |
+ android_library("base_java") { |
+ srcjar_deps = [ |
+ ":foo_generated_enum", |
+ ] |
+ } |
+ ``` |
+ |
+4. The generated file `org/chromium/chrome/FooBar.java` would contain: |
+ |
+ ```java |
+ package org.chromium.chrome; |
+ |
+ import android.support.annotation.IntDef; |
+ |
+ import java.lang.annotation.Retention; |
+ import java.lang.annotation.RetentionPolicy; |
+ |
+ public class FooBar { |
+ @IntDef({ |
+ A, B, C |
+ }) |
+ @Retention(RetentionPolicy.SOURCE) |
+ public @interface FooBarEnum {} |
+ public static final int A = 0; |
+ public static final int B = 1; |
+ public static final int C = 1; |
+ } |
+ ``` |
+ |
+## Formatting Notes |
+ |
+* Handling long package names: |
+ |
+ ``` |
+ // GENERATED_JAVA_ENUM_PACKAGE: ( |
+ // org.chromium.chrome.this.package.is.too.long.to.fit.on.a.single.line) |
+ ``` |
+ |
+* Enum entries |
+ * Single line enums should look like this: |
+ |
+ // GENERATED_JAVA_ENUM_PACKAGE: org.foo |
+ enum NotificationActionType { BUTTON, TEXT }; |
+ |
+ * Multi-line enums should have one enum entry per line, like this: |
+ |
+ // GENERATED_JAVA_ENUM_PACKAGE: org.foo |
+ enum NotificationActionType { |
+ BUTTON, |
+ TEXT |
+ }; |
+ |
+ * Multi-line enum entries are allowed but should be formatted like this: |
+ |
+ // GENERATED_JAVA_ENUM_PACKAGE: org.foo |
+ enum NotificationActionType { |
+ LongKeyNumberOne, |
+ LongKeyNumberTwo, |
+ ... |
+ LongKeyNumberThree = |
+ LongKeyNumberOne | LongKeyNumberTwo | ... |
+ }; |
+ |
+* Preserving comments |
+ |
+ ```cpp |
+ // GENERATED_JAVA_ENUM_PACKAGE: org.chromium |
+ enum CommentEnum { |
+ // This comment will be preserved. |
+ ONE, |
+ TWO, // This comment will NOT be preserved. |
+ THREE |
+ } |
+ ``` |
+ |
+ ```java |
+ ... |
+ public class CommentEnum { |
+ ... |
+ /** |
+ * This comment will be preserved. |
+ */ |
+ public static final int ONE = 0; |
+ public static final int TWO = 1; |
+ public static final int THREE = 2; |
+ } |
+ ``` |
+ |
+## Code |
+* [Generator |
+code](https://cs.chromium.org/chromium/src/build/android/gyp/java_cpp_enum.py?dr=C&sq=package:chromium) |
+and |
+[Tests](https://cs.chromium.org/chromium/src/build/android/gyp/java_cpp_enum_tests.py?dr=C&q=java_cpp_enum_tests&sq=package:chromium&l=1) |
+* [GN |
+template](https://cs.chromium.org/chromium/src/build/config/android/rules.gni?q=java_cpp_enum.py&sq=package:chromium&dr=C&l=458) |