-
Notifications
You must be signed in to change notification settings - Fork 12
/
evaljs.c
46 lines (38 loc) · 1.47 KB
/
evaljs.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <nativejavavm.h>
int main(int argc, char **argv) {
struct javavm_and_env jvmenv = create_java_vm(argc, argv);
JavaVM *vm = jvmenv.vm;
JNIEnv *env = jvmenv.env;
if (vm == NULL) {
exit(1);
}
// Lookup classes
jclass t_api = (*env)->FindClass(env, "org/example/native_embedding/NativeAPI");
CHECK_THROW()
// Lookup methods
jmethodID m_api_setup = (*env)->GetStaticMethodID(env, t_api, "setup", "()V");
CHECK_THROW()
jmethodID m_api_tearDown = (*env)->GetStaticMethodID(env, t_api, "tearDown", "()V");
CHECK_THROW()
jmethodID m_api_eval = (*env)->GetStaticMethodID(env, t_api, "eval", "(Ljava/lang/String;)V");
CHECK_THROW()
// Create polyglot context
(*env)->CallStaticObjectMethodA(env, t_api, m_api_setup, NULL);
CHECK_THROW()
// Call the "eval" API method, pass a JS source that prints "Hello from JS" to the API method.
// The JS source is passed as jstring (jobject) obtained by the NewStringUTF JNI method.
jvalue args[1] = { 0 };
jstring jsSource = (*env)->NewStringUTF(env, "print('Hello from JS')");
args[0].l = jsSource; // l in jvalue is for jobject
(*env)->CallStaticVoidMethodA(env, t_api, m_api_eval, args);
CHECK_THROW()
// Close polyglot context
(*env)->CallStaticVoidMethodA(env, t_api, m_api_tearDown, args);
CHECK_THROW()
(*vm)->DestroyJavaVM(vm);
return 0;
}