Panama and Swing/AWT support
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Wed May 24 18:19:43 UTC 2023
Hi Clayton
interacting with JNI code has few issues:
1. you need a JNIEnv* segment
2. you need to be able to wrap Java objects as JNI references (so that
they can be passed as pointers to native calls)
3. expose some way to map method names into JNI mangled names (so that
we can look those up using a symbol lookup)
This is something on our radar and we will like to address this use case
at some point (but it is possible this might be addressed _after_ the
FFM API is finalized). Two possible approaches are:
* a set of static helper functions which allow to obtain JNIEnv segment,
as well as create, dereference and destroy JNI refs. We might even
expose JNI functions here (think of a JNIUtils class)
* a true JNILinker <: Linker - this might allow a tighter coupling with
JNI functions (as the JNIEnv will be passed automatically)
I think the former approach is quite attractive in terms of bang for
bucks. It doesn't add a lot of complexity to the API, and adds the
minimum functionality that is required in order to allow the native
linker to deal with JNI functions as well (even though developers will
need to take some extra care when doing so).
In the meantime, I think it might be possible to define a small JNI
library which takes care of the missing functionalities - e.g. it could
return/accept JNI references as "jlong" (an hack, I know) so, something
like this:
native long makeGlobalRef(Object o) // call NewGlobalRef, cast result to
jlong and return
native void destroyGlobalRef(long ref) // cast to jobject, then call
DeleteGlobalRef
native Object readGlobalRef(long ref) // cast to jobject, return
native long getEnv(); // cast env parameter to jlong and return
I've tried something along those lines and it seems to work as expected.
But I agree that it would be convenient if this "just worked" out of the
box.
Cheers
Maurizio
On 24/05/2023 18:28, Clayton Walker wrote:
> I am working on a project with one of the goals being able to use a
> swing component as a render target. From the documentation here
> <https://docs.oracle.com/javase/8/docs/technotes/guides/awt/AWT_Native_Interface.html> I
> assume we need jni in order to access the native PlatformInfo struct.
> My question is the same as asked in this stackoverflow question
> <https://stackoverflow.com/questions/75620948/how-do-i-get-the-hwnd-of-a-canvas-using-panama>,
> is it possible to use panama to get the HWND of a swing window?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20230524/f9b2a5d7/attachment.htm>
More information about the panama-dev
mailing list