Skip to content

Commit 4d23e07

Browse files
committed
fix(native-image): register array types and key interfaces for Conscrypt JNI in GraalVM
1 parent 463e915 commit 4d23e07

2 files changed

Lines changed: 26 additions & 9 deletions

File tree

sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/nativeimage/GoogleJsonClientFeature.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,12 @@ private void loadConscrypt(BeforeAnalysisAccess access) {
9393
registerClassHierarchyForJni(access, "org.conscrypt.NativeRef");
9494
registerClassHierarchyForJni(access, "org.conscrypt.OpenSSLBIOInputStream");
9595

96-
// Register standard JDK classes accessed via JNI by Conscrypt native C code
96+
// Register array types and JDK classes accessed via JNI by Conscrypt native C code
97+
registerClassForJni(Object[].class);
98+
registerClassForJni(byte[].class);
99+
registerClassForJni(byte[][].class);
100+
registerClassForJni(int[].class);
101+
97102
registerClassHierarchyForJni(access, "java.util.Calendar");
98103
registerClassHierarchyForJni(access, "java.io.InputStream");
99104
registerClassHierarchyForJni(access, "java.io.OutputStream");
@@ -103,6 +108,8 @@ private void loadConscrypt(BeforeAnalysisAccess access) {
103108
registerClassHierarchyForJni(access, "java.lang.Object");
104109
registerClassHierarchyForJni(access, "java.nio.Buffer");
105110
registerClassHierarchyForJni(access, "java.nio.ByteBuffer");
111+
registerClassHierarchyForJni(access, "java.security.PrivateKey");
112+
registerClassHierarchyForJni(access, "java.security.Key");
106113
}
107114
}
108115

sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/nativeimage/NativeImageUtils.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,37 @@ public static void registerConstructorsForReflection(FeatureAccess access, Strin
8686
}
8787
}
8888

89+
/** Registers an entire class for reflection use. */
90+
public static void registerClassForReflection(Class<?> clazz) {
91+
RuntimeReflection.register(clazz);
92+
RuntimeReflection.register(clazz.getDeclaredConstructors());
93+
RuntimeReflection.register(clazz.getDeclaredFields());
94+
RuntimeReflection.register(clazz.getDeclaredMethods());
95+
}
96+
8997
/** Registers an entire class for reflection use. */
9098
public static void registerClassForReflection(FeatureAccess access, String name) {
9199
Class<?> clazz = access.findClassByName(name);
92100
if (clazz != null) {
93-
RuntimeReflection.register(clazz);
94-
RuntimeReflection.register(clazz.getDeclaredConstructors());
95-
RuntimeReflection.register(clazz.getDeclaredFields());
96-
RuntimeReflection.register(clazz.getDeclaredMethods());
101+
registerClassForReflection(clazz);
97102
} else {
98103
LOGGER.log(Level.WARNING, CLASS_REFLECTION_ERROR_MESSAGE, name);
99104
}
100105
}
101106

107+
/** Registers an entire class for JNI use. */
108+
public static void registerClassForJni(Class<?> clazz) {
109+
RuntimeJNIAccess.register(clazz);
110+
RuntimeJNIAccess.register(clazz.getDeclaredConstructors());
111+
RuntimeJNIAccess.register(clazz.getDeclaredFields());
112+
RuntimeJNIAccess.register(clazz.getDeclaredMethods());
113+
}
114+
102115
/** Registers an entire class for JNI use. */
103116
public static void registerClassForJni(FeatureAccess access, String name) {
104117
Class<?> clazz = access.findClassByName(name);
105118
if (clazz != null) {
106-
RuntimeJNIAccess.register(clazz);
107-
RuntimeJNIAccess.register(clazz.getDeclaredConstructors());
108-
RuntimeJNIAccess.register(clazz.getDeclaredFields());
109-
RuntimeJNIAccess.register(clazz.getDeclaredMethods());
119+
registerClassForJni(clazz);
110120
} else {
111121
LOGGER.log(Level.WARNING, CLASS_REFLECTION_ERROR_MESSAGE, name);
112122
}

0 commit comments

Comments
 (0)