java.lang.IllegalAccessError when running code

0

I'm in the process of making an application in Java that loads and displays an X3D model, and I've downloaded all the correct jars and placed them in the project and I can see each of the classes that each of the jars contains. However, when I run my code in NetBeans, I get the following error:

No skin defined in xj3d-skin.properties
Producing default properties.
Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.j3d.aviatrix3d.ViewEnvironment.<init>()V from class org.j3d.aviatrix3d.surface.BaseRenderingProcessor
    at org.j3d.aviatrix3d.surface.BaseRenderingProcessor.<init>(BaseRenderingProcessor.java:223)
    at org.j3d.aviatrix3d.surface.RenderingProcessor.<init>(RenderingProcessor.java:49)
    at org.j3d.aviatrix3d.surface.SimpleAWTSurface.<init>(SimpleAWTSurface.java:95)
    at org.web3d.ogl.browser.X3DBrowserJPanel.<init>(X3DBrowserJPanel.java:264)
    at org.web3d.ogl.browser.X3DOGLBrowserFactoryImpl.createComponent(X3DOGLBrowserFactoryImpl.java:249)
    at org.web3d.x3d.sai.BrowserFactory.createX3DComponent(BrowserFactory.java:252)
    at xj3dtest.Xj3DTest.<init>(Xj3DTest.java:43)
    at xj3dtest.Xj3DTest.main(Xj3DTest.java:59)
C:\Users\matt\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1

The java code that I have for the project at time point is shown below:

package xj3dtest;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import static java.lang.Boolean.TRUE;
import javax.swing.JFrame;
import org.web3d.x3d.sai.Browser;
import org.web3d.x3d.sai.BrowserFactory;
import org.web3d.x3d.sai.X3DComponent;
import org.web3d.x3d.sai.X3DScene;
import java.util.HashMap;

public class Xj3DTest extends JFrame {

    public Xj3DTest(String title) {

        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Setup browser parameters
        HashMap requestedParameters=new HashMap();
        requestedParameters.put("Antialiased",TRUE);
        requestedParameters.put("TextureQuality","MEDIUM");
        requestedParameters.put("PrimitiveQuality","MEDIUM");
        requestedParameters.put("Xj3D_InterfaceType","SWING");
        requestedParameters.put("Xj3D_NavbarShown",TRUE);
        requestedParameters.put("Xj3D_NavbarPosition","TOP");
        requestedParameters.put("Xj3D_LocationShown",TRUE);
        requestedParameters.put("Xj3D_LocationPosition","TOP");
        requestedParameters.put("Xj3D_LocationReadOnly",TRUE);
        requestedParameters.put("Xj3D_ShowConsole",TRUE);
        requestedParameters.put("Xj3D_OpenButtonShown",TRUE);
        requestedParameters.put("Xj3D_ReloadButtonShown",TRUE);
        requestedParameters.put("Xj3D_StatusBarShown",TRUE);
        requestedParameters.put("Xj3D_FPSShown",TRUE);
        requestedParameters.put("Xj3D_ContentDirectory","CurrentDirectory");
        requestedParameters.put("Xj3D_AntialiasingQuality","LOW");
        requestedParameters.put("Xj3D_Culling_Mode", "frustum");

        System.setProperty("x3d.sai.factory.class", "org.web3d.ogl.browser.X3DOGLBrowserFactoryImpl");
        X3DComponent x3dComponent = BrowserFactory.createX3DComponent(requestedParameters);

        Browser browser = x3dComponent.getBrowser();

        Component browserComponent = (Component)    x3dComponent.getImplementation();

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add(browserComponent, BorderLayout.CENTER);

        X3DScene scene = browser.createX3DFromURL(new String[]   {"test.x3dv"});

        browser.replaceWorld(scene);
    }

    public static void main(String[] args) {
        Xj3DTest frame = new Xj3DTest("Xj3D test");
        frame.setSize(640, 480);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

As you can see from the error message that I'm receiving, I'm getting an exception that's java.lang.IllegalAccessError and I'm wondering how I'd go about fixing it. Thanks.

EDIT

The following list is all the jars that I'm using.

aviatrix3d-all
aviatrix3d-all_2.2.0
aviatrix3d-core
aviatrix3d-glsl
aviatrix3d-utils
dis-enums
gnu-redexp-1.0.8
httpclient
j3d-org-all_3.0.0-nps
jogl_old
uri
vecmath
vlc_uri
xj3d-common_2.0.0
xj3d-config_
xj3d-core_2.0.0
xj3d-ecmascript_2.0.0
xj3d-external-sai_2.0.0
xj3d-j3d
xj3d-java-sai_2.0.0
xj3d-jaxp_2.0.0
xj3d-net
xj3d-norender_2.0.0
xj3d-ogl
xj3d-parser_2.0.0 
xj3d-render_2.0.0 
xj3d-runtime
xj3d-runtime_2.0.0
xj3d-sai_2.0.0
xj3d-sav_2.0.0
xj3d-script-base
xj3d-script-base_2.0.0
xj3d-xml_2.0.0

EDIT #2

I've done the modifications and I've downloaded the xj3d-2.1 installer and put it into a library and put it in the project. And my code looks like the following.

package xj3dtest;

import java.awt.BorderLayout;
import java.awt.Container;
import static java.lang.Boolean.TRUE;
import javax.swing.JFrame;
import org.web3d.x3d.sai.Browser;
import org.web3d.x3d.sai.BrowserFactory;
import org.web3d.x3d.sai.X3DComponent;
import org.web3d.x3d.sai.X3DScene;
import java.util.HashMap;

public class Xj3DTest extends JFrame {

    public Xj3DTest(String title) {

        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Setup browser parameters
        HashMap requestedParameters=new HashMap();
        requestedParameters.put("Antialiased",TRUE);
        requestedParameters.put("TextureQuality","MEDIUM");
        requestedParameters.put("PrimitiveQuality","MEDIUM");
        requestedParameters.put("Xj3D_InterfaceType","SWING");
        requestedParameters.put("Xj3D_NavbarShown",TRUE);
        requestedParameters.put("Xj3D_NavbarPosition","TOP");
        requestedParameters.put("Xj3D_LocationShown",TRUE);
        requestedParameters.put("Xj3D_LocationPosition","TOP");
        requestedParameters.put("Xj3D_LocationReadOnly",TRUE);
        requestedParameters.put("Xj3D_ShowConsole",TRUE);
        requestedParameters.put("Xj3D_OpenButtonShown",TRUE);
        requestedParameters.put("Xj3D_ReloadButtonShown",TRUE);
        requestedParameters.put("Xj3D_StatusBarShown",TRUE);
        requestedParameters.put("Xj3D_FPSShown",TRUE);
        requestedParameters.put("Xj3D_ContentDirectory","CurrentDirectory");
        requestedParameters.put("Xj3D_AntialiasingQuality","LOW");
        requestedParameters.put("Xj3D_Culling_Mode", "frustum");

        System.setProperty("x3d.sai.factory.class", "org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl");
        X3DComponent x3dComponent = BrowserFactory.createX3DComponent(requestedParameters);

        Browser browser = x3dComponent.getBrowser();

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add((javax.swing.JPanel)x3dComponent, BorderLayout.CENTER);

        X3DScene scene = browser.createX3DFromURL(new String[]   {"test.x3dv"});

        browser.replaceWorld(scene);
    }

    public static void main(String[] args) {
        Xj3DTest frame = new Xj3DTest("Xj3D test");
        frame.setSize(640, 480);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

And the run time error that I'm getting now is:

Feb 27, 2016 10:00:03 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Exception in thread "main" java.lang.IllegalArgumentException: BrowserConfig:  PrimitiveQuality must be low, medium or high
    at org.xj3d.sai.BrowserConfig.initialize(BrowserConfig.java:355)
    at org.xj3d.sai.BrowserConfig.<init>(BrowserConfig.java:240)
    at     org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl.createComponent(X3DOGLBrowserFactoryImpl.java:211)
    at     org.web3d.x3d.sai.BrowserFactory.createX3DComponent(BrowserFactory.java:263)
    at xj3dtest.Xj3DTest.<init>(Xj3DTest.java:42)
    at xj3dtest.Xj3DTest.main(Xj3DTest.java:56)
C:\Users\matt\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53:   Java returned: 1
java
netbeans
asked on Stack Overflow Feb 25, 2016 by smitthy • edited Feb 28, 2016 by smitthy

1 Answer

0

OK, I think I've got something working.

It looks like your code was written to work with Xj3D 1. I made a few modifications to the code to get it working with Xj3D 2. Firstly, change the line that calls System.setProperty to the following:

        System.setProperty("x3d.sai.factory.class", "org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl");

The idea to make this change was taken from here.

Secondly, the values of the parameters TextureQuality, PrimitiveQuality and Xj3D_AntialiasingQuality need to be in lower-case, not upper-case as they are at the moment.

Thirdly, it turns out that the X3DComponent that gets returned by the call to BrowserFactory.createX3DComponent is a subclass of JPanel, so it can be added directly to the Container without needing to call getImplementation(). Delete the line

        Component browserComponent = (Component)    x3dComponent.getImplementation();

and replace the line

        cp.add(browserComponent, BorderLayout.CENTER);

with

        cp.add((javax.swing.JPanel)x3dComponent, BorderLayout.CENTER);

Finally, you need to use the following five JARs, all of which are provided by the xj3d-2.1 installer which can be downloaded from here:

  • xj3d-2.1-3rdparty-nps.jar
  • xj3d-2.1-nps.jar
  • jogl-all.jar
  • joal.jar
  • gluegen-rt.jar

After making these changes I was able to use your Xj3DTest class to view an X3D file. I don't have your test.x3dv file so I used the X3D file on Wikipedia. Your class appeared to work for me – I'm using Java 1.8.0_60 x64 on Windows 10 x64, if that helps – but it wasn't without its issues:

  • It takes about two minutes for the window to open. I don't know what it's doing in this time. Process Explorer shows two jogamp_exe_tstNUMBERS.exe processes, each of which runs for about a minute.
  • The following message (exception stack trace omitted) appears after the two minutes:

    SEVERE: Native code library (32 and 64 bit library) failed to load: java.lang.UnsatisfiedLinkError: no odejava in java.library.path
    

    If you can find a binary version of the odejava library then you are doing better than me. Still, the program appears to work without it.

  • The following messages appear a number of times just before the window opens. Again, I'm not sure why but they don't appear to do any harm:

    Message: Attempting to make GL context current again in order to initialise the surface
    Error: The GL context failed to initialise for some mysterious reason
    
  • The program doesn't quit cleanly: I have to kill the java.exe process from Process Explorer after closing the window.

answered on Stack Overflow Feb 27, 2016 by Luke Woodward

User contributions licensed under CC BY-SA 3.0