8254024: Enhance native libs for AWT and Swing to work with GraalVM Native Image

Reviewed-by: serb, ihse, bobv
This commit is contained in:
Andrii Rodionov 2020-12-15 21:37:38 +00:00 committed by Bob Vandette
parent c37eabe73b
commit 7977e381ea
4 changed files with 92 additions and 11 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -39,7 +39,7 @@ typedef struct {
typedef mlib_image *(*MlibCreateFP_t)(mlib_type, mlib_s32, mlib_s32,
mlib_s32);
typedef mlib_image *(*MlibCreateStructFP_t)(mlib_type, mlib_s32, mlib_s32,
mlib_s32, mlib_s32, void *);
mlib_s32, mlib_s32, const void *);
typedef void (*MlibDeleteFP_t)(mlib_image *);
typedef struct {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -43,6 +43,13 @@
#define VERBOSE_AWT_DEBUG
#endif
#ifdef STATIC_BUILD
extern void Java_sun_xawt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
jobject frame, jstring jcommand);
extern void Java_sun_xawt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jarray);
#endif
static void *awtHandle = NULL;
typedef jint JNICALL JNI_OnLoad_type(JavaVM *vm, void *reserved);
@ -118,13 +125,13 @@ AWT_OnLoad(JavaVM *vm, void *reserved)
}
jvm = vm;
#ifndef STATIC_BUILD
/* Get address of this library and the directory containing it. */
dladdr((void *)AWT_OnLoad, &dlinfo);
realpath((char *)dlinfo.dli_fname, buf);
len = strlen(buf);
p = strrchr(buf, '/');
#endif
/*
* The code below is responsible for:
* 1. Loading appropriate awt library, i.e. libawt_xawt or libawt_headless
@ -156,8 +163,10 @@ AWT_OnLoad(JavaVM *vm, void *reserved)
}
#endif
#ifndef STATIC_BUILD
/* Calculate library name to load */
strncpy(p, tk, MAXPATHLEN-len-1);
#endif
if (fmProp) {
(*env)->DeleteLocalRef(env, fmProp);
@ -166,6 +175,8 @@ AWT_OnLoad(JavaVM *vm, void *reserved)
(*env)->DeleteLocalRef(env, fmanager);
}
#ifndef STATIC_BUILD
jstring jbuf = JNU_NewStringPlatform(env, buf);
CHECK_EXCEPTION_FATAL(env, "Could not allocate library name");
JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "load",
@ -173,7 +184,7 @@ AWT_OnLoad(JavaVM *vm, void *reserved)
jbuf);
awtHandle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL);
#endif
return JNI_VERSION_1_2;
}
@ -198,14 +209,16 @@ Java_sun_awt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
jobject frame, jstring jcommand);
static XsessionWMcommand_type *XsessionWMcommand = NULL;
#ifndef STATIC_BUILD
if (XsessionWMcommand == NULL && awtHandle == NULL) {
return;
}
XsessionWMcommand = (XsessionWMcommand_type *)
dlsym(awtHandle, "Java_sun_awt_motif_XsessionWMcommand");
#else
XsessionWMcommand = (XsessionWMcommand_type *)Java_sun_xawt_motif_XsessionWMcommand;
#endif
if (XsessionWMcommand == NULL)
return;
@ -225,16 +238,30 @@ Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jargv)
XsessionWMcommand_New_type(JNIEnv *env, jobjectArray jargv);
static XsessionWMcommand_New_type *XsessionWMcommand = NULL;
#ifndef STATIC_BUILD
if (XsessionWMcommand == NULL && awtHandle == NULL) {
return;
}
XsessionWMcommand = (XsessionWMcommand_New_type *)
dlsym(awtHandle, "Java_sun_awt_motif_XsessionWMcommand_New");
#else
XsessionWMcommand = (XsessionWMcommand_New_type *)Java_sun_xawt_motif_XsessionWMcommand_New;
#endif
if (XsessionWMcommand == NULL)
return;
(*XsessionWMcommand)(env, jargv);
}
#ifdef STATIC_BUILD
__attribute__((weak)) void Java_sun_xawt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jarray)
{
}
__attribute__((weak)) void Java_sun_xawt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
jobject frame, jstring jcommand)
{
}
#endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -36,9 +36,50 @@
#include "awt_Mlib.h"
#include "java_awt_image_BufferedImage.h"
#ifdef STATIC_BUILD
#include "mlib_image.h"
#endif
static void start_timer(int numsec);
static void stop_timer(int numsec, int ntimes);
#ifdef STATIC_BUILD
// Mapping functions to their names for runtime check
static mlibFnS_t sMlibFnsStatic[] = {
{j2d_mlib_ImageConvMxN, "j2d_mlib_ImageConvMxN"},
{j2d_mlib_ImageAffine, "j2d_mlib_ImageAffine"},
{j2d_mlib_ImageLookUp, "j2d_mlib_ImageLookUp"},
{j2d_mlib_ImageConvKernelConvert, "j2d_mlib_ImageConvKernelConvert"},
};
mlib_status awt_getImagingLib(JNIEnv *env, mlibFnS_t *sMlibFns,
mlibSysFnS_t *sMlibSysFns) {
mlibFnS_t *mptr;
int i;
char *fName;
mlibSysFnS_t tempSysFns;
mlib_status ret = MLIB_SUCCESS;
tempSysFns.createFP = j2d_mlib_ImageCreate;
tempSysFns.createStructFP = j2d_mlib_ImageCreateStruct;
tempSysFns.deleteImageFP = j2d_mlib_ImageDelete;
*sMlibSysFns = tempSysFns;
mptr = sMlibFns;
i = 0;
while (mptr[i].fname != NULL) {
fName = mptr[i].fname;
if(strcmp(fName, sMlibFnsStatic[i].fname) == 0) {
mptr[i].fptr = sMlibFnsStatic[i].fptr;
} else {
ret = MLIB_FAILURE;
}
i++;
}
return ret;
}
#else
/*
* This is called by awt_ImagingLib.initLib()
*/
@ -121,6 +162,7 @@ mlib_status awt_getImagingLib(JNIEnv *env, mlibFnS_t *sMlibFns,
}
return ret;
}
#endif
mlib_start_timer awt_setMlibStartTimer() {
return start_timer;

View File

@ -300,9 +300,12 @@ Java_java_awt_TextField_initIDs
{
}
#ifndef STATIC_BUILD
// The same function exists in libawt.a::awt_LoadLibrary.c
JNIEXPORT jboolean JNICALL AWTIsHeadless() {
return JNI_FALSE;
}
#endif
JNIEXPORT void JNICALL Java_java_awt_Dialog_initIDs (JNIEnv *env, jclass cls)
{
@ -811,8 +814,13 @@ Window get_xawt_root_shell(JNIEnv *env) {
*/
JNIEXPORT void JNICALL
Java_sun_awt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
#ifdef STATIC_BUILD
Java_sun_xawt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
jobject frame, jstring jcommand)
#else
Java_sun_awt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
jobject frame, jstring jcommand)
#endif
{
const char *command;
XTextProperty text_prop;
@ -856,7 +864,11 @@ Java_sun_awt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
* name. It's not! It's just a plain function.
*/
JNIEXPORT void JNICALL
#ifdef STATIC_BUILD
Java_sun_xawt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jarray)
#else
Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jarray)
#endif
{
jsize length;
char ** array;