Skip to content

Commit 2406922

Browse files
committed
Use JNIRuntimeAccess API were appropriate
1 parent 415fddf commit 2406922

File tree

12 files changed

+171
-186
lines changed

12 files changed

+171
-186
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JNIRegistrationUtil.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
import org.graalvm.nativeimage.hosted.Feature.AfterAnalysisAccess;
3838
import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess;
3939
import org.graalvm.nativeimage.hosted.Feature.FeatureAccess;
40+
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
4041
import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport;
4142

42-
import com.oracle.svm.core.jni.JNIRuntimeAccess;
4343
import com.oracle.svm.core.util.ConcurrentIdentityHashMap;
4444
import com.oracle.svm.core.util.VMError;
4545
import com.oracle.svm.util.ReflectionUtil;
@@ -106,8 +106,8 @@ protected static Field[] fields(FeatureAccess access, String className, String..
106106

107107
protected static void registerForThrowNew(FeatureAccess access, String... exceptionClassNames) {
108108
for (String exceptionClassName : exceptionClassNames) {
109-
JNIRuntimeAccess.register(clazz(access, exceptionClassName));
110-
JNIRuntimeAccess.register(constructor(access, exceptionClassName, String.class));
109+
RuntimeJNIAccess.register(clazz(access, exceptionClassName));
110+
RuntimeJNIAccess.register(constructor(access, exceptionClassName, String.class));
111111
}
112112
}
113113

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIRuntimeAccess.java

+6-19
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,9 @@
3030
import org.graalvm.nativeimage.ImageSingletons;
3131
import org.graalvm.nativeimage.Platform;
3232
import org.graalvm.nativeimage.Platforms;
33+
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
3334
import org.graalvm.nativeimage.impl.ConfigurationCondition;
34-
import org.graalvm.nativeimage.impl.ReflectionRegistry;
35-
36-
import com.oracle.svm.core.SubstrateOptions;
37-
import com.oracle.svm.core.option.SubstrateOptionsParser;
38-
import com.oracle.svm.core.util.UserError;
35+
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
3936

4037
/**
4138
* Support for registering classes, methods and fields before and during the analysis so they are
@@ -47,28 +44,18 @@ private JNIRuntimeAccess() {
4744
}
4845

4946
public static void register(Class<?>... classes) {
50-
getSupport().register(ConfigurationCondition.alwaysTrue(), classes);
47+
RuntimeJNIAccess.register(classes);
5148
}
5249

5350
public static void register(Executable... methods) {
54-
getSupport().register(ConfigurationCondition.alwaysTrue(), false, methods);
51+
RuntimeJNIAccess.register(methods);
5552
}
5653

5754
public static void register(Field... fields) {
58-
register(false, fields);
55+
RuntimeJNIAccess.register(fields);
5956
}
6057

6158
public static void register(boolean finalIsWritable, Field... fields) {
62-
getSupport().register(ConfigurationCondition.alwaysTrue(), finalIsWritable, fields);
63-
}
64-
65-
private static JNIRuntimeAccessibilitySupport getSupport() {
66-
if (!ImageSingletons.contains(JNIRuntimeAccessibilitySupport.class)) {
67-
throw UserError.abort("Support for JNI is not enabled. The option %s must be set.", SubstrateOptionsParser.commandArgument(SubstrateOptions.JNI, "+"));
68-
}
69-
return ImageSingletons.lookup(JNIRuntimeAccessibilitySupport.class);
70-
}
71-
72-
public interface JNIRuntimeAccessibilitySupport extends ReflectionRegistry {
59+
ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), finalIsWritable, fields);
7360
}
7461
}

substratevm/src/com.oracle.svm.graal.hotspot.libgraal/src/com/oracle/svm/graal/hotspot/libgraal/LibGraalFeature.java

+8-11
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@
102102
import org.graalvm.nativeimage.StackValue;
103103
import org.graalvm.nativeimage.VMRuntime;
104104
import org.graalvm.nativeimage.hosted.Feature;
105+
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
105106
import org.graalvm.nativeimage.hosted.RuntimeReflection;
106-
import org.graalvm.nativeimage.impl.ConfigurationCondition;
107107
import org.graalvm.word.LocationIdentity;
108108
import org.graalvm.word.Pointer;
109109
import org.graalvm.word.WordFactory;
@@ -126,7 +126,6 @@
126126
import com.oracle.svm.core.graal.snippets.NodeLoweringProvider;
127127
import com.oracle.svm.core.heap.GCCause;
128128
import com.oracle.svm.core.heap.Heap;
129-
import com.oracle.svm.core.jni.JNIRuntimeAccess;
130129
import com.oracle.svm.core.log.FunctionPointerLogHandler;
131130
import com.oracle.svm.core.option.HostedOptionKey;
132131
import com.oracle.svm.core.option.RuntimeOptionKey;
@@ -216,10 +215,9 @@ public void afterRegistration(AfterRegistrationAccess access) {
216215

217216
@Override
218217
public void duringSetup(DuringSetupAccess access) {
219-
JNIRuntimeAccess.JNIRuntimeAccessibilitySupport registry = ImageSingletons.lookup(JNIRuntimeAccess.JNIRuntimeAccessibilitySupport.class);
220218
ImageClassLoader imageClassLoader = ((DuringSetupAccessImpl) access).getImageClassLoader();
221-
registerJNIConfiguration(registry, imageClassLoader);
222219

220+
registerJNIConfiguration(imageClassLoader);
223221
EconomicMap<String, OptionDescriptor> descriptors = EconomicMap.create();
224222
for (Class<? extends OptionDescriptors> optionsClass : imageClassLoader.findSubclasses(OptionDescriptors.class, false)) {
225223
if (!Modifier.isAbstract(optionsClass.getModifiers()) && !OptionDescriptorsMap.class.isAssignableFrom(optionsClass)) {
@@ -349,10 +347,9 @@ UserException error(String format, Object... args) {
349347
}
350348
}
351349

352-
private static void registerJNIConfiguration(JNIRuntimeAccess.JNIRuntimeAccessibilitySupport registry, ImageClassLoader loader) {
350+
private static void registerJNIConfiguration(ImageClassLoader loader) {
353351
try (JNIConfigSource source = new JNIConfigSource(loader)) {
354352
Map<String, Class<?>> classes = new HashMap<>();
355-
ConfigurationCondition condition = ConfigurationCondition.alwaysTrue();
356353
for (String line : source.lines) {
357354
source.lineNo++;
358355
String[] tokens = line.split(" ");
@@ -361,8 +358,8 @@ private static void registerJNIConfiguration(JNIRuntimeAccess.JNIRuntimeAccessib
361358
Class<?> clazz = classes.get(className);
362359
if (clazz == null) {
363360
clazz = source.findClass(className);
364-
registry.register(condition, clazz);
365-
registry.register(condition, Array.newInstance(clazz, 0).getClass());
361+
RuntimeJNIAccess.register(clazz);
362+
RuntimeJNIAccess.register(Array.newInstance(clazz, 0).getClass());
366363
classes.put(className, clazz);
367364
}
368365

@@ -371,7 +368,7 @@ private static void registerJNIConfiguration(JNIRuntimeAccess.JNIRuntimeAccessib
371368
source.check(tokens.length == 4, "Expected 4 tokens for a field");
372369
String fieldName = tokens[2];
373370
try {
374-
registry.register(condition, false, clazz.getDeclaredField(fieldName));
371+
RuntimeJNIAccess.register(clazz.getDeclaredField(fieldName));
375372
} catch (NoSuchFieldException e) {
376373
throw source.error("Field %s.%s not found", clazz.getTypeName(), fieldName);
377374
} catch (NoClassDefFoundError e) {
@@ -390,15 +387,15 @@ private static void registerJNIConfiguration(JNIRuntimeAccess.JNIRuntimeAccessib
390387
try {
391388
if ("<init>".equals(methodName)) {
392389
Constructor<?> cons = clazz.getDeclaredConstructor(parameters);
393-
registry.register(condition, false, cons);
390+
RuntimeJNIAccess.register(cons);
394391
if (Throwable.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
395392
if (usedInTranslatedException(parameters)) {
396393
RuntimeReflection.register(clazz);
397394
RuntimeReflection.register(cons);
398395
}
399396
}
400397
} else {
401-
registry.register(condition, false, clazz.getDeclaredMethod(methodName, parameters));
398+
RuntimeJNIAccess.register(clazz.getDeclaredMethod(methodName, parameters));
402399
}
403400
} catch (NoSuchMethodException e) {
404401
throw source.error("Method %s.%s%s not found: %s", clazz.getTypeName(), methodName, descriptor, e);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
8989
import org.graalvm.nativeimage.ImageSingletons;
9090
import org.graalvm.nativeimage.hosted.Feature;
91+
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
9192
import org.graalvm.nativeimage.hosted.RuntimeReflection;
9293
import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport;
9394

@@ -100,7 +101,6 @@
100101
import com.oracle.svm.core.jdk.NativeLibrarySupport;
101102
import com.oracle.svm.core.jdk.PlatformNativeLibrarySupport;
102103
import com.oracle.svm.core.jdk.SecurityProvidersFilter;
103-
import com.oracle.svm.core.jni.JNIRuntimeAccess;
104104
import com.oracle.svm.core.option.HostedOptionKey;
105105
import com.oracle.svm.core.option.LocatableMultiOptionValue;
106106
import com.oracle.svm.core.util.UserError;
@@ -474,26 +474,26 @@ private static void registerSunMSCAPIConfig(BeforeAnalysisAccess a) {
474474
}
475475

476476
private static void registerLoadKeysOrCertificateChains(DuringAnalysisAccess a) {
477-
JNIRuntimeAccess.register(constructor(a, "java.util.ArrayList"));
478-
JNIRuntimeAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificate", byte[].class, Collection.class));
479-
JNIRuntimeAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificateChain", String.class, Collection.class));
480-
JNIRuntimeAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateKeyAndCertificateChain", boolean.class, String.class, long.class, long.class, int.class, Collection.class));
477+
RuntimeJNIAccess.register(constructor(a, "java.util.ArrayList"));
478+
RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificate", byte[].class, Collection.class));
479+
RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateCertificateChain", String.class, Collection.class));
480+
RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CKeyStore", "generateKeyAndCertificateChain", boolean.class, String.class, long.class, long.class, int.class, Collection.class));
481481
}
482482

483483
private static void registerGenerateCKeyPair(DuringAnalysisAccess a) {
484-
JNIRuntimeAccess.register(constructor(a, "sun.security.mscapi.CKeyPair", String.class, long.class, long.class, int.class));
484+
RuntimeJNIAccess.register(constructor(a, "sun.security.mscapi.CKeyPair", String.class, long.class, long.class, int.class));
485485
}
486486

487487
private static void registerCPrivateKeyOf(DuringAnalysisAccess a) {
488-
JNIRuntimeAccess.register(method(a, "sun.security.mscapi.CPrivateKey", "of", String.class, long.class, long.class, int.class));
488+
RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CPrivateKey", "of", String.class, long.class, long.class, int.class));
489489
}
490490

491491
private static void registerCPublicKeyOf(DuringAnalysisAccess a) {
492-
JNIRuntimeAccess.register(method(a, "sun.security.mscapi.CPublicKey", "of", String.class, long.class, long.class, int.class));
492+
RuntimeJNIAccess.register(method(a, "sun.security.mscapi.CPublicKey", "of", String.class, long.class, long.class, int.class));
493493
}
494494

495495
private static void linkJaas(DuringAnalysisAccess a) {
496-
JNIRuntimeAccess.register(fields(a, "com.sun.security.auth.module.UnixSystem", "username", "uid", "gid", "groups"));
496+
RuntimeJNIAccess.register(fields(a, "com.sun.security.auth.module.UnixSystem", "username", "uid", "gid", "groups"));
497497

498498
NativeLibraries nativeLibraries = ((DuringAnalysisAccessImpl) a).getNativeLibraries();
499499
/* We can statically link jaas, thus we classify it as builtIn library */

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationAwt.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.graalvm.nativeimage.Platform;
3030
import org.graalvm.nativeimage.Platforms;
3131
import org.graalvm.nativeimage.hosted.Feature;
32+
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
3233
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
3334
import org.graalvm.nativeimage.impl.InternalPlatform;
3435

@@ -37,7 +38,6 @@
3738
import com.oracle.svm.core.jdk.JNIRegistrationUtil;
3839
import com.oracle.svm.core.jdk.NativeLibrarySupport;
3940
import com.oracle.svm.core.jdk.PlatformNativeLibrarySupport;
40-
import com.oracle.svm.core.jni.JNIRuntimeAccess;
4141
import com.oracle.svm.hosted.FeatureImpl;
4242
import com.oracle.svm.hosted.c.NativeLibraries;
4343

@@ -97,11 +97,11 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
9797

9898
private static void handlePreferencesClassReachable(DuringAnalysisAccess access) {
9999

100-
JNIRuntimeAccess.register(method(access, "java.lang.System", "setProperty", String.class, String.class));
101-
JNIRuntimeAccess.register(method(access, "java.lang.System", "loadLibrary", String.class));
100+
RuntimeJNIAccess.register(method(access, "java.lang.System", "setProperty", String.class, String.class));
101+
RuntimeJNIAccess.register(method(access, "java.lang.System", "loadLibrary", String.class));
102102

103-
JNIRuntimeAccess.register(java.awt.GraphicsEnvironment.class);
104-
JNIRuntimeAccess.register(method(access, "java.awt.GraphicsEnvironment", "isHeadless"));
103+
RuntimeJNIAccess.register(GraphicsEnvironment.class);
104+
RuntimeJNIAccess.register(method(access, "java.awt.GraphicsEnvironment", "isHeadless"));
105105

106106
NativeLibraries nativeLibraries = getNativeLibraries(access);
107107

@@ -163,13 +163,13 @@ private static void registerFreeType(DuringAnalysisAccess access) {
163163
nativeLibraries.addStaticJniLibrary("fontmanager", isHeadless() ? "awt_headless" : "awt_xawt");
164164
nativeLibraries.addDynamicNonJniLibrary("freetype");
165165

166-
JNIRuntimeAccess.register(clazz(access, "sun.font.FontConfigManager$FontConfigInfo"));
167-
JNIRuntimeAccess.register(fields(access, "sun.font.FontConfigManager$FontConfigInfo", "fcVersion", "cacheDirs"));
168-
JNIRuntimeAccess.register(clazz(access, "sun.font.FontConfigManager$FcCompFont"));
169-
JNIRuntimeAccess.register(fields(access, "sun.font.FontConfigManager$FcCompFont", "fcName", "firstFont", "allFonts"));
170-
JNIRuntimeAccess.register(clazz(access, "sun.font.FontConfigManager$FontConfigFont"));
171-
JNIRuntimeAccess.register(constructor(access, "sun.font.FontConfigManager$FontConfigFont"));
172-
JNIRuntimeAccess.register(fields(access, "sun.font.FontConfigManager$FontConfigFont", "familyName", "styleStr", "fullName", "fontFile"));
166+
RuntimeJNIAccess.register(clazz(access, "sun.font.FontConfigManager$FontConfigInfo"));
167+
RuntimeJNIAccess.register(fields(access, "sun.font.FontConfigManager$FontConfigInfo", "fcVersion", "cacheDirs"));
168+
RuntimeJNIAccess.register(clazz(access, "sun.font.FontConfigManager$FcCompFont"));
169+
RuntimeJNIAccess.register(fields(access, "sun.font.FontConfigManager$FcCompFont", "fcName", "firstFont", "allFonts"));
170+
RuntimeJNIAccess.register(clazz(access, "sun.font.FontConfigManager$FontConfigFont"));
171+
RuntimeJNIAccess.register(constructor(access, "sun.font.FontConfigManager$FontConfigFont"));
172+
RuntimeJNIAccess.register(fields(access, "sun.font.FontConfigManager$FontConfigFont", "familyName", "styleStr", "fullName", "fontFile"));
173173
}
174174

175175
private static void registerColorProfiles(DuringAnalysisAccess duringAnalysisAccess) {

0 commit comments

Comments
 (0)