You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[Java.Interop] Allow JniRuntime init from JavaVM* and JNIEnv* (#1158)
Context: #1153
[JNI][0] supports *two* modes of operation:
1. Native code creates the JVM, e.g. via [`JNI_CreateJavaVM()`][1]
2. The JVM already exists, and when Java code calls
[`System.loadLibrary()`][3], the JVM calls the
[`JNI_OnLoad()`][2] function on the specified library.
Java.Interop samples and unit tests rely on the first approach,
e.g. `TestJVM` subclasses `JreRuntime`, which is responsible for
calling `JNI_CreateJavaVM()` so that Java code can be used.
PR #1153 is exploring the use of [.NET Native AOT][4] to produce a
native library which is used with Java-originated initialization.
In order to make Java-originated initialization *work*, we need
to be able to initialize `JniRuntime` and `JreRuntime` around
existing JVM-provided pointers:
* The `JavaVM*` provided to `JNI_OnLoad()`, which can be used to
set `JniRuntime.CreationOptions.InvocationPointer`:
[UnmanagedCallersOnly(EntryPoint="JNI_OnLoad")]
int JNI_OnLoad(IntPtr vm, IntPtr reserved)
{
var options = new JreRuntimeOptions {
InvocationPointer = vm,
};
var runtime = options.CreateJreVM ();
return runtime.JniVersion;
return JNI_VERSION_1_6;
}
* The [`JNIEnv*` value provided to Java `native` methods][5] when
they are invoked, which can be used to set
`JniRuntime.CreationOptions.EnvironmentPointer`:
[UnmanagedCallersOnly(EntryPoint="Java_example_Whatever_init")]
void Whatever_init(IntPtr jnienv, IntPtr Whatever_class)
{
var options = new JreRuntimeOptions {
EnvironmentPointer = jnienv,
};
var runtime = options.CreateJreVM ();
}
Update `JniRuntime` and `JreRuntime` to support these Java-originated
initialization strategies. In particular, don't require that
`JreRuntimeOptions.JvmLibraryPath` be set, avoiding:
System.InvalidOperationException: Member `JreRuntimeOptions.JvmLibraryPath` must be set.
at Java.Interop.JreRuntime.CreateJreVM(JreRuntimeOptions builder)
at Java.Interop.JreRuntime..ctor(JreRuntimeOptions builder)
at Java.Interop.JreRuntimeOptions.CreateJreVM()
[0]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html
[1]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#creating_the_vm
[2]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runtime.html#loadLibrary(java.lang.String)
[3]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#JNJI_OnLoad
[4]: https://learn.microsoft.com/dotnet/core/deploying/native-aot/
[5]: https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#native_method_arguments
0 commit comments