[jnigen] fixed the problem with annotations containing enums + reg tests (https://github.com/dart-lang/jnigen/issues/150)

diff --git a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java
index bb52e46..d128815 100644
--- a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java
+++ b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/doclet/ElementBuilders.java
@@ -95,11 +95,10 @@
       var val = values.get(key);
       var obj = val.getValue();
       // TODO(#23): Accurately represent more complex annotation values
-      if (obj instanceof String || obj instanceof Number) {
+      if (obj instanceof Number) {
         annotation.properties.put(key.getSimpleName().toString(), obj);
       } else {
-        annotation.properties.put(
-            key.getSimpleName().toString(), val.accept(new AnnotationVisitor(this), null));
+        annotation.properties.put(key.getSimpleName().toString(), obj.toString());
       }
     }
     return annotation;
diff --git a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java
index e8ba624..89460bc 100644
--- a/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java
+++ b/pkgs/jnigen/java/src/main/java/com/github/dart_lang/jnigen/apisummarizer/elements/JavaAnnotation.java
@@ -13,8 +13,8 @@
   public Map<String, Object> properties = new HashMap<>();
 
   public static class EnumVal {
-    String enumClass;
-    String value;
+    public String enumClass;
+    public String value;
 
     public EnumVal(String enumClass, String value) {
       this.enumClass = enumClass;
diff --git a/pkgs/jnigen/test/bindings_test.dart b/pkgs/jnigen/test/bindings_test.dart
index cb0aa97..772d034 100644
--- a/pkgs/jnigen/test/bindings_test.dart
+++ b/pkgs/jnigen/test/bindings_test.dart
@@ -45,6 +45,8 @@
         join(group, 'generics', 'StringStack.java'),
         join(group, 'generics', 'StringValuedMap.java'),
         join(group, 'generics', 'StringKeyedMap.java'),
+        join(group, 'annotations', 'JsonSerializable.java'),
+        join(group, 'annotations', 'MyDataClass.java'),
         join(group, 'pkg2', 'C2.java'),
         join(group, 'pkg2', 'Example.java'),
       ],
diff --git a/pkgs/jnigen/test/simple_package_test/generate.dart b/pkgs/jnigen/test/simple_package_test/generate.dart
index 99eb0c1..657dd90 100644
--- a/pkgs/jnigen/test/simple_package_test/generate.dart
+++ b/pkgs/jnigen/test/simple_package_test/generate.dart
@@ -31,6 +31,8 @@
   join(javaPrefix, 'generics', 'StringStack.java'),
   join(javaPrefix, 'generics', 'StringValuedMap.java'),
   join(javaPrefix, 'generics', 'StringKeyedMap.java'),
+  join(javaPrefix, 'annotations', 'JsonSerializable.java'),
+  join(javaPrefix, 'annotations', 'MyDataClass.java'),
 ];
 
 void compileJavaSources(String workingDir, List<String> files) async {
@@ -52,6 +54,7 @@
       'com.github.dart_lang.jnigen.simple_package',
       'com.github.dart_lang.jnigen.pkg2',
       'com.github.dart_lang.jnigen.generics',
+      'com.github.dart_lang.jnigen.annotations',
     ],
     logLevel: Level.INFO,
     outputConfig: OutputConfig(
diff --git a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/JsonSerializable.java b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/JsonSerializable.java
new file mode 100644
index 0000000..af7071e
--- /dev/null
+++ b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/JsonSerializable.java
@@ -0,0 +1,19 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.github.dart_lang.jnigen.annotations;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.TYPE)
+public @interface JsonSerializable {
+  public static enum Case {
+    SNAKE_CASE,
+    KEBAB_CASE,
+    CAMEL_CASE
+  }
+
+  public Case value();
+}
diff --git a/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/MyDataClass.java b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/MyDataClass.java
new file mode 100644
index 0000000..ff71b69
--- /dev/null
+++ b/pkgs/jnigen/test/simple_package_test/java/com/github/dart_lang/jnigen/annotations/MyDataClass.java
@@ -0,0 +1,8 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.github.dart_lang.jnigen.annotations;
+
+@JsonSerializable(JsonSerializable.Case.CAMEL_CASE)
+public class MyDataClass {}
diff --git a/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart b/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
index 841cabe..aa79dbe 100644
--- a/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
+++ b/pkgs/jnigen/test/simple_package_test/lib/simple_package.dart
@@ -1525,3 +1525,106 @@
     (this as jni.JArray<jni.JObject>)[index] = value;
   }
 }
+
+/// from: com.github.dart_lang.jnigen.annotations.JsonSerializable$Case
+class JsonSerializable_Case extends jni.JObject {
+  late final jni.JObjType? _$type;
+  @override
+  jni.JObjType get $type => _$type ??= type;
+
+  JsonSerializable_Case.fromRef(
+    jni.JObjectPtr ref,
+  ) : super.fromRef(ref);
+
+  /// The type which includes information such as the signature of this class.
+  static const type = $JsonSerializable_CaseType();
+
+  static final _values =
+      jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
+              "JsonSerializable_Case__values")
+          .asFunction<jni.JniResult Function()>();
+
+  /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case[] values()
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static jni.JArray<JsonSerializable_Case> values() =>
+      const jni.JArrayType($JsonSerializable_CaseType())
+          .fromRef(_values().object);
+
+  static final _valueOf = jniLookup<
+          ffi.NativeFunction<
+              jni.JniResult Function(
+                  ffi.Pointer<ffi.Void>)>>("JsonSerializable_Case__valueOf")
+      .asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();
+
+  /// from: static public com.github.dart_lang.jnigen.annotations.JsonSerializable.Case valueOf(java.lang.String name)
+  /// The returned object must be deleted after use, by calling the `delete` method.
+  static JsonSerializable_Case valueOf(jni.JString name) =>
+      const $JsonSerializable_CaseType()
+          .fromRef(_valueOf(name.reference).object);
+}
+
+class $JsonSerializable_CaseType extends jni.JObjType<JsonSerializable_Case> {
+  const $JsonSerializable_CaseType();
+
+  @override
+  String get signature =>
+      r"Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;";
+
+  @override
+  JsonSerializable_Case fromRef(jni.JObjectPtr ref) =>
+      JsonSerializable_Case.fromRef(ref);
+}
+
+extension $JsonSerializable_CaseArray on jni.JArray<JsonSerializable_Case> {
+  JsonSerializable_Case operator [](int index) {
+    return (elementType as $JsonSerializable_CaseType)
+        .fromRef(elementAt(index, jni.JniCallType.objectType).object);
+  }
+
+  void operator []=(int index, JsonSerializable_Case value) {
+    (this as jni.JArray<jni.JObject>)[index] = value;
+  }
+}
+
+/// from: com.github.dart_lang.jnigen.annotations.MyDataClass
+class MyDataClass extends jni.JObject {
+  late final jni.JObjType? _$type;
+  @override
+  jni.JObjType get $type => _$type ??= type;
+
+  MyDataClass.fromRef(
+    jni.JObjectPtr ref,
+  ) : super.fromRef(ref);
+
+  /// The type which includes information such as the signature of this class.
+  static const type = $MyDataClassType();
+
+  static final _ctor = jniLookup<ffi.NativeFunction<jni.JniResult Function()>>(
+          "MyDataClass__ctor")
+      .asFunction<jni.JniResult Function()>();
+
+  /// from: public void <init>()
+  MyDataClass() : super.fromRef(_ctor().object);
+}
+
+class $MyDataClassType extends jni.JObjType<MyDataClass> {
+  const $MyDataClassType();
+
+  @override
+  String get signature =>
+      r"Lcom/github/dart_lang/jnigen/annotations/MyDataClass;";
+
+  @override
+  MyDataClass fromRef(jni.JObjectPtr ref) => MyDataClass.fromRef(ref);
+}
+
+extension $MyDataClassArray on jni.JArray<MyDataClass> {
+  MyDataClass operator [](int index) {
+    return (elementType as $MyDataClassType)
+        .fromRef(elementAt(index, jni.JniCallType.objectType).object);
+  }
+
+  void operator []=(int index, MyDataClass value) {
+    (this as jni.JArray<jni.JObject>)[index] = value;
+  }
+}
diff --git a/pkgs/jnigen/test/simple_package_test/src/simple_package.c b/pkgs/jnigen/test/simple_package_test/src/simple_package.c
index ba17028..e5937df 100644
--- a/pkgs/jnigen/test/simple_package_test/src/simple_package.c
+++ b/pkgs/jnigen/test/simple_package_test/src/simple_package.c
@@ -1190,3 +1190,68 @@
   return (JniResult){.result = {.l = to_global_ref(_result)},
                      .exception = check_exception()};
 }
+
+// com.github.dart_lang.jnigen.annotations.JsonSerializable$Case
+jclass _c_JsonSerializable_Case = NULL;
+
+jmethodID _m_JsonSerializable_Case__values = NULL;
+FFI_PLUGIN_EXPORT
+JniResult JsonSerializable_Case__values() {
+  load_env();
+  load_class_gr(
+      &_c_JsonSerializable_Case,
+      "com/github/dart_lang/jnigen/annotations/JsonSerializable$Case");
+  if (_c_JsonSerializable_Case == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(
+      _c_JsonSerializable_Case, &_m_JsonSerializable_Case__values, "values",
+      "()[Lcom/github/dart_lang/jnigen/annotations/JsonSerializable$Case;");
+  if (_m_JsonSerializable_Case__values == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result = (*jniEnv)->CallStaticObjectMethod(
+      jniEnv, _c_JsonSerializable_Case, _m_JsonSerializable_Case__values);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
+jmethodID _m_JsonSerializable_Case__valueOf = NULL;
+FFI_PLUGIN_EXPORT
+JniResult JsonSerializable_Case__valueOf(jobject name) {
+  load_env();
+  load_class_gr(
+      &_c_JsonSerializable_Case,
+      "com/github/dart_lang/jnigen/annotations/JsonSerializable$Case");
+  if (_c_JsonSerializable_Case == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_static_method(_c_JsonSerializable_Case,
+                     &_m_JsonSerializable_Case__valueOf, "valueOf",
+                     "(Ljava/lang/String;)Lcom/github/dart_lang/jnigen/"
+                     "annotations/JsonSerializable$Case;");
+  if (_m_JsonSerializable_Case__valueOf == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result = (*jniEnv)->CallStaticObjectMethod(
+      jniEnv, _c_JsonSerializable_Case, _m_JsonSerializable_Case__valueOf,
+      name);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}
+
+// com.github.dart_lang.jnigen.annotations.MyDataClass
+jclass _c_MyDataClass = NULL;
+
+jmethodID _m_MyDataClass__ctor = NULL;
+FFI_PLUGIN_EXPORT
+JniResult MyDataClass__ctor() {
+  load_env();
+  load_class_gr(&_c_MyDataClass,
+                "com/github/dart_lang/jnigen/annotations/MyDataClass");
+  if (_c_MyDataClass == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  load_method(_c_MyDataClass, &_m_MyDataClass__ctor, "<init>", "()V");
+  if (_m_MyDataClass__ctor == NULL)
+    return (JniResult){.result = {.j = 0}, .exception = check_exception()};
+  jobject _result =
+      (*jniEnv)->NewObject(jniEnv, _c_MyDataClass, _m_MyDataClass__ctor);
+  return (JniResult){.result = {.l = to_global_ref(_result)},
+                     .exception = check_exception()};
+}