godot/doc/classes/JavaClassWrapper.xml
Thaddeus Crews a490c267a2
Merge pull request #115498 from m4gr3d/add_javaclasswrapper_proxy_interfaces
Android: Allow implementing java interfaces from GDScript
2026-04-01 12:55:15 -05:00

82 lines
4.5 KiB
XML

<?xml version="1.0" encoding="UTF-8" ?>
<class name="JavaClassWrapper" inherits="Object" api_type="core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
Provides access to the Java Native Interface.
</brief_description>
<description>
The JavaClassWrapper singleton provides a way for the Godot application to send and receive data through the [url=https://developer.android.com/training/articles/perf-jni]Java Native Interface[/url] (JNI).
[b]Note:[/b] This singleton is only available in Android builds.
[codeblock]
var LocalDateTime = JavaClassWrapper.wrap("java.time.LocalDateTime")
var DateTimeFormatter = JavaClassWrapper.wrap("java.time.format.DateTimeFormatter")
var datetime = LocalDateTime.now()
var formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")
print(datetime.format(formatter))
[/codeblock]
[b]Warning:[/b] When calling Java methods, be sure to check [method JavaClassWrapper.get_exception] to check if the method threw an exception.
</description>
<tutorials>
<link title="Integrating with Android APIs">$DOCS_URL/tutorials/platform/android/javaclasswrapper_and_androidruntimeplugin.html</link>
</tutorials>
<methods>
<method name="create_proxy">
<return type="JavaObject" />
<param index="0" name="object" type="Object" />
<param index="1" name="interfaces" type="PackedStringArray" />
<description>
Creates a [JavaObject] implementing the given Java interfaces using the given [Object] as the implementation.
The [param object] must contain methods signatures matching the methods signatures from the passed Java [param interfaces]. Invoking methods from the Java [param interfaces] will route to the matching [param object] method.
[codeblock]
class PrintProxy:
func println(content: String) -&gt; void:
print(content)
var print_proxy = PrintProxy.new()
var printer_object = JavaClassWrapper.create_proxy(print_proxy, ["android.util.Printer"])
printer_object.println("Hello Godot World!")
[/codeblock]
[b]Note:[/b] This method only works on Android. On every other platform, this method will always return [code]null[/code].
</description>
</method>
<method name="create_sam_callback">
<return type="JavaObject" />
<param index="0" name="sam_interface" type="String" />
<param index="1" name="callable" type="Callable" />
<description>
Creates a [JavaObject] implementing the Java Single Abstract Method (SAM) interface using the Godot [Callable] as the implementation.
The [param sam_interface] [b]must be[/b] a Java SAM interface, meaning it must only have a single abstract method to implement.
The [param callable] must be able to handle the same parameter types as the SAM interface method, and must provide the same return type. The [param callable] will be invoked as a callback, passing the arguments from the Java SAM interface method.
[codeblock]
var cb = func (content: String) -&gt; void:
print(content)
var callback = JavaClassWrapper.create_sam_callback("android.util.Printer", cb)
callback.println("Hello Godot World!")
[/codeblock]
[b]Note:[/b] This method only works on Android. On every other platform, this method will always return [code]null[/code].
</description>
</method>
<method name="get_exception">
<return type="JavaObject" />
<description>
Returns the Java exception from the last call into a Java class. If there was no exception, it will return [code]null[/code].
[b]Note:[/b] This method only works on Android. On every other platform, this method will always return [code]null[/code].
</description>
</method>
<method name="wrap">
<return type="JavaClass" />
<param index="0" name="name" type="String" />
<description>
Wraps a class defined in Java, and returns it as a [JavaClass] [Object] type that Godot can interact with.
When wrapping inner (nested) classes, use [code]$[/code] instead of [code].[/code] to separate them. For example, [code]JavaClassWrapper.wrap("android.view.WindowManager$LayoutParams")[/code] wraps the [b]WindowManager.LayoutParams[/b] class.
[b]Note:[/b] To invoke a constructor, call a method with the same name as the class. For example:
[codeblock]
var Intent = JavaClassWrapper.wrap("android.content.Intent")
var intent = Intent.Intent()
[/codeblock]
[b]Note:[/b] This method only works on Android. On every other platform, this method does nothing and returns an empty [JavaClass].
</description>
</method>
</methods>
</class>