diff --git a/CHANGELOG.md b/CHANGELOG.md index 523b6208f..839bc01ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ + * Add `Generator` support for `enum` classes with `boolean` values ([issue #388](https://github.com/bytedeco/javacpp/issues/388)) * Fix `Parser` outputting invalid Java code for `enum` of `boolean`, `byte`, and `short` types ([issue #388](https://github.com/bytedeco/javacpp/issues/388)) * Pick up in `Generator` the `@Namespace` annotation from paired method too for global getters and setters ([issue #387](https://github.com/bytedeco/javacpp/issues/387)) * Add presets for `jnijavacpp` and `javacpp-platform` artifact to fix issues at load time ([issue bytedeco/javacv#1305](https://github.com/bytedeco/javacv/issues/1305)) diff --git a/src/main/java/org/bytedeco/javacpp/tools/Generator.java b/src/main/java/org/bytedeco/javacpp/tools/Generator.java index 386b1728e..a4a890d83 100644 --- a/src/main/java/org/bytedeco/javacpp/tools/Generator.java +++ b/src/main/java/org/bytedeco/javacpp/tools/Generator.java @@ -144,6 +144,7 @@ public Generator(Logger logger, Properties properties, String encoding) { this.encoding = encoding; } + static enum BooleanEnum { BOOLEAN; boolean value; } static enum ByteEnum { BYTE; byte value; } static enum ShortEnum { SHORT; short value; } static enum IntEnum { INT; int value; } @@ -452,6 +453,7 @@ boolean classes(boolean handleExceptions, boolean defineAdapters, boolean conver out.println("static jfieldID JavaCPP_deallocatorFID = NULL;"); out.println("static jfieldID JavaCPP_ownerAddressFID = NULL;"); if (declareEnums) { + out.println("static jfieldID JavaCPP_booleanValueFID = NULL;"); out.println("static jfieldID JavaCPP_byteValueFID = NULL;"); out.println("static jfieldID JavaCPP_shortValueFID = NULL;"); out.println("static jfieldID JavaCPP_intValueFID = NULL;"); @@ -1570,6 +1572,11 @@ boolean classes(boolean handleExceptions, boolean defineAdapters, boolean conver out.println(" return JNI_ERR;"); out.println(" }"); if (declareEnums) { + out.println(" JavaCPP_booleanValueFID = JavaCPP_getFieldID(env, \"" + + BooleanEnum.class.getName().replace('.', '/') + "\", \"value\", \"Z\");"); + out.println(" if (JavaCPP_booleanValueFID == NULL) {"); + out.println(" return JNI_ERR;"); + out.println(" }"); out.println(" JavaCPP_byteValueFID = JavaCPP_getFieldID(env, \"" + ByteEnum.class.getName().replace('.', '/') + "\", \"value\", \"B\");"); out.println(" if (JavaCPP_byteValueFID == NULL) {"); diff --git a/src/test/java/org/bytedeco/javacpp/EnumTest.java b/src/test/java/org/bytedeco/javacpp/EnumTest.java index be20b0d90..a88e85a60 100644 --- a/src/test/java/org/bytedeco/javacpp/EnumTest.java +++ b/src/test/java/org/bytedeco/javacpp/EnumTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Samuel Audet + * Copyright (C) 2018-2020 Samuel Audet * * Licensed either under the Apache License, Version 2.0, or (at your option) * under the terms of the GNU General Public License as published by @@ -38,6 +38,13 @@ @Platform(compiler = "cpp11", include = "EnumTest.h") public class EnumTest { + public static enum BoolEnum { + BOOL(true); + + public final boolean value; + private BoolEnum(boolean v) { this.value = v; } + } + @Name("CharEnum") public static enum ByteEnum { BYTE((byte)123); @@ -77,6 +84,7 @@ public LongEnum call(ByteEnum e) { } } + public static native BoolEnum Char2Bool(ByteEnum e); public static native ShortEnum Char2Short(ByteEnum e); public static native LongEnum Int2Long(IntEnum e); public static native LongEnum enumCallback(EnumCallback f); @@ -94,6 +102,7 @@ public LongEnum call(ByteEnum e) { @Test public void testEnum() { System.out.println("Enum"); + assertEquals(true, Char2Bool(ByteEnum.BYTE).value); assertEquals(123, Char2Short(ByteEnum.BYTE).value); assertEquals(789, Int2Long(IntEnum.INT).value); assertEquals(101112, enumCallback(new EnumCallback()).value); diff --git a/src/test/resources/org/bytedeco/javacpp/EnumTest.h b/src/test/resources/org/bytedeco/javacpp/EnumTest.h index 64d316b6f..73f2b00e1 100644 --- a/src/test/resources/org/bytedeco/javacpp/EnumTest.h +++ b/src/test/resources/org/bytedeco/javacpp/EnumTest.h @@ -1,3 +1,7 @@ +enum class BoolEnum : bool { + BOOL_ENUM = 1 +}; + enum class CharEnum : char { CHAR_ENUM = 42 }; @@ -14,6 +18,10 @@ enum /* no class */ LongEnum : long long { LONG_ENUM = 121110 }; +BoolEnum Char2Bool(CharEnum e) { + return (BoolEnum)e; +} + ShortEnum Char2Short(CharEnum e) { return (ShortEnum)e; }