Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ImageIO app fails to run with UnsatisfiedLinkError when using jpeg image types #3031

Closed
jerboaa opened this issue Nov 27, 2020 · 2 comments · Fixed by #3032
Closed

ImageIO app fails to run with UnsatisfiedLinkError when using jpeg image types #3031

jerboaa opened this issue Nov 27, 2020 · 2 comments · Fixed by #3032

Comments

@jerboaa
Copy link
Collaborator

jerboaa commented Nov 27, 2020

When building graal master tree at revision 64bd483 and trying to run the below reproducer it fails at runtime with:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageWriter.initWriterIDs(Ljava/lang/Class;Ljava/lang/Class;)V [symbol: Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs or Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs__Ljava_lang_Class_2Ljava_lang_Class_2]
	at com.oracle.svm.jni.access.JNINativeLinkage.getOrFindEntryPoint(JNINativeLinkage.java:153)
	at com.oracle.svm.jni.JNIGeneratedMethodSupport.nativeCallAddress(JNIGeneratedMethodSupport.java:57)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriter.initWriterIDs(JPEGImageWriter.java)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriter.<clinit>(JPEGImageWriter.java:184)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:351)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:271)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi.createWriterInstance(JPEGImageWriterSpi.java:100)
	at javax.imageio.spi.ImageWriterSpi.createWriterInstance(ImageWriterSpi.java:351)
	at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:849)
	at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:833)
	at javax.imageio.ImageIO.getWriter(ImageIO.java:1612)
	at javax.imageio.ImageIO.write(ImageIO.java:1540)
	at TestImageIOWrite.test(TestImageIOWrite.java:34)
	at TestImageIOWrite.main(TestImageIOWrite.java:22)

This doesn't happen with plain Java mode. Relevant images are being produced in that mode.

Steps to reproduce the issue

$ cat TestImageIOWrite.java 
import static java.awt.image.BufferedImage.TYPE_BYTE_BINARY;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class TestImageIOWrite {

    static Color[] colors = new Color[] {
            Color.white, Color.red, Color.green,
            Color.blue, Color.black };

    static final int dx = 50;
    static final int h = 100;

    public static void main(String[] args) throws Exception {
        TestImageIOWrite iIo = new TestImageIOWrite();
        iIo.test();
    }

    private void test() throws IOException {
        BufferedImage src = createTestImage();

        String[] fileFormats = new String[] { "jpg", "tiff", "bmp", "gif", "png", "wbmp" };
        for (int i = 0; i < fileFormats.length; i++) {
            String fName = "test." + fileFormats[i];
            File f = new File(fName);

            System.out.println("Writing image: " + fName);
            if (!ImageIO.write(src, fileFormats[i].toUpperCase(), f)) {
                throw new RuntimeException("Failed to write test image.");
            }
        }
        System.out.println("Test passed");
    }

    private static BufferedImage createTestImage() {
        BufferedImage img = new BufferedImage(dx * colors.length, h, TYPE_BYTE_BINARY);

        Graphics2D g = img.createGraphics();
        for (int i = 0; i < colors.length; i++) {
            g.setColor(colors[i]);
            g.fillRect(i * dx, 0, dx, h);
        }
        g.dispose();

        return img;
    }

}
$ javac TestImageIOWrite.java
$ rm -rf META-INF/native-image/* && bin/java -agentlib:native-image-agent=config-output-dir=META-INF/native-image TestImageIOWrite
$ native-image TestImageIOWrite imageio-write
[imageio-write:53331]    classlist:   1,946.88 ms,  0.96 GB
[imageio-write:53331]        (cap):     548.67 ms,  0.96 GB
[imageio-write:53331]        setup:   2,087.91 ms,  0.96 GB
[imageio-write:53331]     (clinit):     306.45 ms,  2.30 GB
[imageio-write:53331]   (typeflow):   8,958.72 ms,  2.30 GB
[imageio-write:53331]    (objects):   9,285.01 ms,  2.30 GB
[imageio-write:53331]   (features):     668.16 ms,  2.30 GB
[imageio-write:53331]     analysis:  19,645.81 ms,  2.30 GB
[imageio-write:53331]     universe:     783.42 ms,  2.30 GB
[imageio-write:53331]      (parse):   2,552.77 ms,  2.30 GB
[imageio-write:53331]     (inline):   3,010.83 ms,  2.30 GB
[imageio-write:53331]    (compile):  17,978.80 ms,  4.77 GB
[imageio-write:53331]      compile:  24,685.78 ms,  4.77 GB
[imageio-write:53331]        image:   2,392.33 ms,  4.77 GB
[imageio-write:53331]        write:     425.90 ms,  4.77 GB
[imageio-write:53331]      [total]:  52,186.78 ms,  4.77 GB
$ ./imageio-write 
Writing image: test.jpg
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageWriter.initWriterIDs(Ljava/lang/Class;Ljava/lang/Class;)V [symbol: Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs or Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs__Ljava_lang_Class_2Ljava_lang_Class_2]
	at com.oracle.svm.jni.access.JNINativeLinkage.getOrFindEntryPoint(JNINativeLinkage.java:153)
	at com.oracle.svm.jni.JNIGeneratedMethodSupport.nativeCallAddress(JNIGeneratedMethodSupport.java:57)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriter.initWriterIDs(JPEGImageWriter.java)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriter.<clinit>(JPEGImageWriter.java:184)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:351)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:271)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi.createWriterInstance(JPEGImageWriterSpi.java:100)
	at javax.imageio.spi.ImageWriterSpi.createWriterInstance(ImageWriterSpi.java:351)
	at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:849)
	at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:833)
	at javax.imageio.ImageIO.getWriter(ImageIO.java:1612)
	at javax.imageio.ImageIO.write(ImageIO.java:1540)
	at TestImageIOWrite.test(TestImageIOWrite.java:34)
	at TestImageIOWrite.main(TestImageIOWrite.java:22)

Describe GraalVM and your environment:

  • Graal master at 64bd483
  • JDK major version: 11
  • OS: Linux
  • Architecture: AMD64

More details

Expected:

$ ./imageio-write 
Writing image: test.jpg
Writing image: test.tiff
Writing image: test.bmp
Writing image: test.gif
Writing image: test.png
Writing image: test.wbmp
Test passed

Actual:

$ ./imageio-write 
Writing image: test.jpg
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.sun.imageio.plugins.jpeg.JPEGImageWriter.initWriterIDs(Ljava/lang/Class;Ljava/lang/Class;)V [symbol: Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs or Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initWriterIDs__Ljava_lang_Class_2Ljava_lang_Class_2]
	at com.oracle.svm.jni.access.JNINativeLinkage.getOrFindEntryPoint(JNINativeLinkage.java:153)
	at com.oracle.svm.jni.JNIGeneratedMethodSupport.nativeCallAddress(JNIGeneratedMethodSupport.java:57)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriter.initWriterIDs(JPEGImageWriter.java)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriter.<clinit>(JPEGImageWriter.java:184)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:351)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:271)
	at com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi.createWriterInstance(JPEGImageWriterSpi.java:100)
	at javax.imageio.spi.ImageWriterSpi.createWriterInstance(ImageWriterSpi.java:351)
	at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:849)
	at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:833)
	at javax.imageio.ImageIO.getWriter(ImageIO.java:1612)
	at javax.imageio.ImageIO.write(ImageIO.java:1540)
	at TestImageIOWrite.test(TestImageIOWrite.java:34)
	at TestImageIOWrite.main(TestImageIOWrite.java:22)
@fernando-valdez
Copy link
Member

Hi @jerboaa. Thank you for reporting this issue. I will take a look at it.

@jerboaa
Copy link
Collaborator Author

jerboaa commented Nov 30, 2020

Hi @jerboaa. Thank you for reporting this issue. I will take a look at it.

OK, thanks. Please see #3032 for a proposed fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants