Giter Club home page Giter Club logo

ultralight-java's Introduction

Ultralight Discord | Ultralight Upstream | CI

Ultralight Java

Java wrapper for the Ultralight web engine

Discord Chat

Got a question about Ultralight or Ultralight Java? Come chat with us on Discord!

Join the #java channel on the Ultralight Discord!

About

Ultralight Java is a complete wrapper over the Ultralight API including the JavaScriptCore API. Ultralight Java allows you to use the powerful Ultralight engine without leaving the Java platform.

What is Ultralight?

Ultralight is a lightweight, cross-platform, HTML rendering engine for desktop apps and games. It supports most modern HTML5 and JavaScript features while still remaining small in binary size and memory usage.

See the Ultralight Upstream for more information.

What makes Ultralight Java different from JCEF or JavaFX WebView?

Other than JCEF and the JavaFX WebView, Ultralight aims to be a lightweight UI engine. While it is capable of displaying fully fledged websites, it does so without using as much memory and CPU. It is the ideal solution for a simple, HTML based UI, while staying with the Java platform.

Moreover, the databind API is capable of translating Java objects directly to JavaScript, allowing interop and Java calls directly from within your JavaScript code, making integration with the UI even easier.

Using the library

The library requires the Ultralight SDK, which can be downloaded here. The native binaries of the SDK need to be available at runtime and can be loaded using the provided Java methods.

Maven

Using the library with maven:

<dependency>
  <groupId>com.labymedia</groupId>
  <artifactId>ultralight-java-base</artifactId>
  <!-- Replace with latest version from https://search.maven.org/artifact/com.labymedia/ultralight-java-base !-->
  <version>%VERSION%</version>
</dependency>

If you need Javascript interop:

<dependency>
  <groupId>com.labymedia</groupId>
  <artifactId>ultralight-java-databind</artifactId>
  <!-- Replace with latest version from https://search.maven.org/artifact/com.labymedia/ultralight-java-databind !-->
  <version>%VERSION%</version>
</dependency>

Gradle

dependencies {
  // Replace with latest version from https://search.maven.org/artifact/com.labymedia/ultralight-java-base
  implementation("com.labymedia", "ultralight-java-base", "%VERSION%")

  // // Replace with latest version from https://search.maven.org/artifact/com.labymedia/ultralight-java-databind
  // Remove the comments if you need Javascript interop
  // implementation("com.labymedia", "ultralight-java-databind", "%VERSION%")
}

The latest version can usually also be found in the VERSION file on the master branch.

You will also need to download the Ultralight SDK and extract the bin folder into a directory given to the Library in order to provide the natives!

See Examples for more info.

Sponsors

YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET applications. YourKit is the creator of YourKit Java Profiler , YourKit .NET Profiler, and YourKit YouMonitor.

Licensing

For Ultralight Java LGPLv3 is being used, however, Ultralight itself is licensed under a custom proprietary license. See Ultralight licensing for further information.

ultralight-java's People

Contributors

derrop avatar dimach avatar hdecarne avatar jakobbruening avatar jan-br avatar janrupf avatar joshuafhiggins avatar juliarn avatar r0bbyyt avatar upcraftlp avatar zortax avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ultralight-java's Issues

Natives fail to load

When following the examples, Java throws an UnsatisfiedLinkError when trying to load libUltralightCore. I'm properly setting the java.library.path to also have the Ultralight bin files. I have no idea why it isn't working and have tried my best to follow it in debug mode. This also occurs on both Linux and Windows and I don't know about macOS

Here's the full expection:

Exception in thread "main" java.lang.RuntimeException: Failed to load ultralight-java-gpu native library.
	at com.labymedia.ultralight.gpu.UltralightGPUDriverNativeUtil.load(UltralightGPUDriverNativeUtil.java:141)
	at me.toast.engine.ui.UserInterface.<init>(UserInterface.java:62)
	at me.toast.engine.Mod.<init>(Mod.java:41)
	at test.game.DeathmatchMod.<init>(DeathmatchMod.java:19)
	at me.toast.engine.Main.run(Main.java:13)
	at me.toast.engine.Main.main(Main.java:42)
Caused by: java.lang.UnsatisfiedLinkError: /home/joshuahiggins/Documents/GitHub/ButterEngine/bin/libultralight-java-gpu.so: libUltralightCore.so: cannot open shared object file: No such file or directory
	at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
	at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:383)
	at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:227)
	at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:169)
	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2383)
	at java.base/java.lang.Runtime.load0(Runtime.java:746)
	at java.base/java.lang.System.load(System.java:1857)
	at com.labymedia.ultralight.gpu.UltralightGPUDriverNativeUtil.load(UltralightGPUDriverNativeUtil.java:139)
	... 5 more

Here's my code for starting Ultralight:

        Path nativesDir = Paths.get("bin/");

        String libraryPath = System.getProperty("java.library.path");
        if (libraryPath != null) {
            libraryPath += File.pathSeparator + nativesDir.toAbsolutePath();
        } else {
            libraryPath = nativesDir.toAbsolutePath().toString();
        }

        System.setProperty("java.library.path", libraryPath);

        try {
            UltralightGPUDriverNativeUtil.extractNativeLibrary(nativesDir);
            UltralightJava.extractNativeLibrary(nativesDir);

            UltralightGPUDriverNativeUtil.load(nativesDir);
            UltralightJava.load(nativesDir);
        } catch (UltralightLoadException e) {
            e.printStackTrace();
        }

Here's the tree of my project:

.
├── bin
│   ├── AppCore.dll
│   ├── libAppCore.dylib
│   ├── libAppCore.so
│   ├── libUltralightCore.dylib
│   ├── libUltralightCore.so
│   ├── libUltralight.dylib
│   ├── libultralight-java-gpu.so
│   ├── libultralight-java.so
│   ├── libUltralight.so
│   ├── libWebCore.dylib
│   ├── libWebCore.so
│   ├── resources
│   │   ├── cacert.pem
│   │   └── icudt67l.dat
│   ├── UltralightCore.dll
│   ├── Ultralight.dll
│   └── WebCore.dll
├── libs
│   ├── ...
│   ├── ultralight-java-base-0.4.12.jar
│   ├── ultralight-java-base-0.4.12-javadoc.jar
│   ├── ultralight-java-base-0.4.12-sources.jar
│   ├── ultralight-java-databind-0.4.12.jar
│   ├── ultralight-java-databind-0.4.12-javadoc.jar
│   ├── ultralight-java-databind-0.4.12-sources.jar
│   ├── ultralight-java-gpu-0.4.12.jar
│   ├── ultralight-java-gpu-0.4.12-javadoc.jar
│   ├── ultralight-java-gpu-0.4.12-sources.jar
│   └── ...
├── out
│   └── ...
├── resources
│   ├── assets
│   │   └── ...
│   ├── example.html
│   ├── example.js
│   ├── shader_fill_frag.fs
│   ├── shader_fill_path_frag.fs
│   ├── shader_v2f_c4f_t2f_t2f_d28f.vs
│   ├── shader_v2f_c4f_t2f.vs
│   └── style.css
└── src
    └── ...

The specified procedure could not be found

Error is :

ultralight-java.dll: The specified procedure could not be found

image
image

    implementation 'com.labymedia:ultralight-java-base:0.4.12'
    implementation 'com.labymedia:ultralight-java-databind:0.4.12'

image

im using windows 11

Support Java 9 JPMS

ultralight-java jars are currently considered as unnamed module by Java 9+ and cannot be used from modularized applications/libraries.

Most simple approach would be to add Automatic-Module-Name attribute to the manifests.
However a follow up issue would be caused by the identical base package name within ultralight-java-base.jar and ultralight-java-databind.jar violating the JPMS rule package <-> module. The latter would require a rename of the base package in ultralight-java-databind.jar to e.g. com.labymedia.ultralight.databind.

In case this acceptable I am willing the create the corresponding PR.

Wrong LICENSE?

I see that LabyMod is proprietary and I think that it uses this and https://github.com/LabyMod/opus-jni both licensed under GPL and not the LGPL license therefor using these is not allowed without LabyMod being also available under GPL as long as someone else has contributed code to these repositories which has not happened yet but could and it would lock the license.

My personal opinion is that LGPL/MIT better suites libraries like this anyways and it should be used as such and GPL should be used for standalone applications as intended.

Create project description

Currently, the project does not have a README.md. It should be created soon, so there is something to refer to when using the project.

Memory leak

So it appears there is a memory leak with DatabindJavascriptMethodHandler.Data. I have some javascript that is ran "every frame"

setInterval(() => {
    isEnabled = module.isEnabled();
  }, 0);

the module instance is retrieved from java.importClass. Of course setInterval isn't ideal, but I need to pass data over and it changes constantly. The setInterval function is called A LOT, are are more then 50 instances of it. But it just shows the problem.
Untitled

There are lots of DatabindJavascriptMethodHandler.Data instances being created every second but they are never deleted?

Remove dependency on AppCore

AppCore provides functions which are already supported by the Java platform. The only thing which needs to be investigated is the font loader, as font loading is yet another issue in Java.

Project cleanup

The build system is currently a bit messy - as well as the example. This should be cleaned up.

CI Build

The project needs to be built on CI to be usable by external means, publishing will for now be done to the LabyMedia internal maven.

Is this still maintained ?

To whom it may concern,

I find the idea great, Java in the background and Html/CSS/JS in the front.

Just wondering if this is an experimental package or something rather long term.

Kind Regards

JavaScript Data Bindings

To Do

  • Create a new gradle module.
  • Design an API structure.
  • Implement configuration.
  • Implement toJavascript method.
    • Implement static functions.
      • Implement method overloading.
      • Implement return types.
      • Implicit API.
      • Explicit API.
    • Implement static fields.
      • Synchronization
        • JavaScript → Java.
        • Java → JavaScript.
    • Implement stateful functions.
      • Implement method overloading.
      • Implement return types.
      • Implicit API.
      • Explicit API.
    • Implement stateful fields.
      • Synchronization
        • JavaScript → Java.
        • Java → JavaScript.
    • Types
      • Implement primitive JS types. 404 arrays not found.
      • Implement JavaScript → Java object conversion.
      • Implement Java → JavaScript object conversion.

Upgrade to Ultralight 1.3

This is a tracking issue for the upcoming Ultralight 1.3 release.

A few breaking API changes have been introduced, so the library needs to be adjusted to support these.

Loading the libraries on Linux/MacOS is error prone

Even though the Ultralight libraries might reside directly next to the ultralight-java library, they will not be loaded unless LD_LIBRARY_PATH is set correctly. This can be fixed by manually preloading them.

UnsatisfiedLinkError when jar included manually in project

Hello,

First of all I want to thank you for making these bindings for ultralight, I've been hoping someone would for a while, great work 👍

Now to the issue, I downloaded the build artifacts from the actions workflow of the last build master at https://github.com/LabyMod/ultralight-java/actions/runs/223823217 and included the jar in my gradle project using compile fileTree(include: ['*.jar'], dir: 'libs').

I then took some code from the lwjgl test module you have written and used that to try and load ultralight up.

  UltralightJava.extractNativeLibrary(nativesDir);
  UltralightJava.load(nativesDir);

I've double checked the path to the dll file which gets extracted and it's correct but either way an UnsatisfiedLinkError is thrown.

Caused by: java.lang.UnsatisfiedLinkError: ultralight-java-64 (JVMPORT015E Unable to resolve shared library references - a prerequisite shared library may be missing)

Edit:
It occurred to me that maybe I need the ultralight sdk dll files in my project so I added those, now it loads but throws another UnsatisfiedLinkError.

java.lang.UnsatisfiedLinkError: net/labymedia/ultralight/UltralightPlatform.instance()Lnet/labymedia/ultralight/UltralightPlatform;

This is thrown from this line:

platform = UltralightPlatform.instance();

Thanks

Cannot run program "cmake"

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':ultralight-java-native:build'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.UncheckedIOException: java.io.IOException: Cannot run program "cmake" (in directory "C:\Users\Piotrek\Downloads\ultralight-java\ultralight-java-native\build\cmake-gen-win-x64"): CreateProcess error=2, Unable to locate specified file
	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:61)
	at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:107)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
	at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
	at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
	at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
	at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
	at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
	at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
	at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.io.IOException: Cannot run program "cmake" (in directory "C:\Users\Piotrek\Downloads\ultralight-java\ultralight-java-native\build\cmake-gen-win-x64"): CreateProcess error=2, Unable to locate specified file
	at com.labymedia.gradle.cmake.tasks.CMakeBuildTask.generate(CMakeBuildTask.java:65)
	at com.labymedia.gradle.cmake.tasks.CMakeBuildTask.build(CMakeBuildTask.java:51)

EXCEPTION ACCESS VIOLATION Crash || And Inti Page low FPS

I have two questions

Rendering HTML with Ultralight multiple times will cause the program not to respond and crash
Exit Code:-1073740940 (0xC0000374)
error logs

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffe0be2122e, pid=32972, tid=0x00000000000034a8
#
# JRE version: Java(TM) SE Runtime Environment (8.0_301-b09) (build 1.8.0_301-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.301-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [vcruntime140.dll+0x122e]

It may be a memory overflow, but increasing memory still cannot be solved

Initializing HTML causes FPS to drop, but only for a few seconds. However, it will affect the user experience

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.