fun jvm=(jvm: JavaVM) do jvm_cache = jvm
# Current main `JniEnv`
- # FIXME support threaded Java
fun jni_env: JniEnv
do
if jni_env_cache == null then create_default_jvm
self.jvm = jvm
self.jni_env = builder.jni_env.as(not null)
end
+
+ # Get a Java class by its name from the current `jni_env`
+ fun load_jclass(name: NativeString): JClass import jni_env `{
+ JNIEnv *nit_ffi_jni_env = Sys_jni_env(recv);
+
+ // retreive the implementation Java class
+ jclass java_class = (*nit_ffi_jni_env)->FindClass(nit_ffi_jni_env, name);
+ if (java_class == NULL) {
+ fprintf(stderr, "Nit FFI with Java error: failed to load class.\\n");
+ (*nit_ffi_jni_env)->ExceptionDescribe(nit_ffi_jni_env);
+ exit(1);
+ }
+
+ return java_class;
+ `}
end
# A standard Java string `java.lang.String`
JNIEnv *env = Sys_jni_env(sys);
(*env)->DeleteGlobalRef(env, recv);
`}
+
+ # Delete this local reference
+ fun delete_local_ref import sys, Sys.jni_env `{
+ Sys sys = JavaObject_sys(recv);
+ JNIEnv *env = Sys_jni_env(sys);
+ (*env)->DeleteLocalRef(env, recv);
+ `}
+
+ # Pops the current local reference frame and return a valid reference to self
+ #
+ # Similiar to `JavaVM::pop_local_frame` but returns a value.
+ fun pop_from_local_frame: SELF
+ do
+ var jni_env = sys.jni_env
+ return pop_from_local_frame_with_env(jni_env)
+ end
+
+ private fun pop_from_local_frame_with_env(jni_env: JniEnv): SELF `{
+ return (*jni_env)->PopLocalFrame(jni_env, recv);
+ `}
end