1*977Smax.romanov@gmail.com
2*977Smax.romanov@gmail.com /*
3*977Smax.romanov@gmail.com * Copyright (C) NGINX, Inc.
4*977Smax.romanov@gmail.com */
5*977Smax.romanov@gmail.com
6*977Smax.romanov@gmail.com #include <nxt_unit.h>
7*977Smax.romanov@gmail.com #include <jni.h>
8*977Smax.romanov@gmail.com
9*977Smax.romanov@gmail.com #include "nxt_jni_Thread.h"
10*977Smax.romanov@gmail.com
11*977Smax.romanov@gmail.com
12*977Smax.romanov@gmail.com static jclass nxt_java_Thread_class;
13*977Smax.romanov@gmail.com static jmethodID nxt_java_Thread_currentThread;
14*977Smax.romanov@gmail.com static jmethodID nxt_java_Thread_getContextClassLoader;
15*977Smax.romanov@gmail.com static jmethodID nxt_java_Thread_setContextClassLoader;
16*977Smax.romanov@gmail.com
17*977Smax.romanov@gmail.com
18*977Smax.romanov@gmail.com int
nxt_java_initThread(JNIEnv * env)19*977Smax.romanov@gmail.com nxt_java_initThread(JNIEnv *env)
20*977Smax.romanov@gmail.com {
21*977Smax.romanov@gmail.com jclass cls;
22*977Smax.romanov@gmail.com
23*977Smax.romanov@gmail.com cls = (*env)->FindClass(env, "java/lang/Thread");
24*977Smax.romanov@gmail.com if (cls == NULL) {
25*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.lang.Thread not found");
26*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
27*977Smax.romanov@gmail.com }
28*977Smax.romanov@gmail.com
29*977Smax.romanov@gmail.com nxt_java_Thread_class = (*env)->NewGlobalRef(env, cls);
30*977Smax.romanov@gmail.com (*env)->DeleteLocalRef(env, cls);
31*977Smax.romanov@gmail.com cls = nxt_java_Thread_class;
32*977Smax.romanov@gmail.com
33*977Smax.romanov@gmail.com nxt_java_Thread_currentThread = (*env)->GetStaticMethodID(env, cls,
34*977Smax.romanov@gmail.com "currentThread", "()Ljava/lang/Thread;");
35*977Smax.romanov@gmail.com if (nxt_java_Thread_currentThread == NULL) {
36*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.lang.Thread.currentThread() not found");
37*977Smax.romanov@gmail.com goto failed;
38*977Smax.romanov@gmail.com }
39*977Smax.romanov@gmail.com
40*977Smax.romanov@gmail.com nxt_java_Thread_getContextClassLoader = (*env)->GetMethodID(env, cls,
41*977Smax.romanov@gmail.com "getContextClassLoader", "()Ljava/lang/ClassLoader;");
42*977Smax.romanov@gmail.com if (nxt_java_Thread_getContextClassLoader == NULL) {
43*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.lang.Thread.getContextClassLoader() "
44*977Smax.romanov@gmail.com "not found");
45*977Smax.romanov@gmail.com goto failed;
46*977Smax.romanov@gmail.com }
47*977Smax.romanov@gmail.com
48*977Smax.romanov@gmail.com nxt_java_Thread_setContextClassLoader = (*env)->GetMethodID(env, cls,
49*977Smax.romanov@gmail.com "setContextClassLoader", "(Ljava/lang/ClassLoader;)V");
50*977Smax.romanov@gmail.com if (nxt_java_Thread_setContextClassLoader == NULL) {
51*977Smax.romanov@gmail.com nxt_unit_warn(NULL, "java.lang.Thread.setContextClassLoader() "
52*977Smax.romanov@gmail.com "not found");
53*977Smax.romanov@gmail.com goto failed;
54*977Smax.romanov@gmail.com }
55*977Smax.romanov@gmail.com
56*977Smax.romanov@gmail.com return NXT_UNIT_OK;
57*977Smax.romanov@gmail.com
58*977Smax.romanov@gmail.com failed:
59*977Smax.romanov@gmail.com
60*977Smax.romanov@gmail.com (*env)->DeleteGlobalRef(env, cls);
61*977Smax.romanov@gmail.com return NXT_UNIT_ERROR;
62*977Smax.romanov@gmail.com }
63*977Smax.romanov@gmail.com
64*977Smax.romanov@gmail.com void
nxt_java_setContextClassLoader(JNIEnv * env,jobject cl)65*977Smax.romanov@gmail.com nxt_java_setContextClassLoader(JNIEnv *env, jobject cl)
66*977Smax.romanov@gmail.com {
67*977Smax.romanov@gmail.com jobject thread;
68*977Smax.romanov@gmail.com
69*977Smax.romanov@gmail.com thread = (*env)->CallStaticObjectMethod(env, nxt_java_Thread_class,
70*977Smax.romanov@gmail.com nxt_java_Thread_currentThread);
71*977Smax.romanov@gmail.com
72*977Smax.romanov@gmail.com if (thread == NULL) {
73*977Smax.romanov@gmail.com return;
74*977Smax.romanov@gmail.com }
75*977Smax.romanov@gmail.com
76*977Smax.romanov@gmail.com (*env)->CallVoidMethod(env, thread, nxt_java_Thread_setContextClassLoader,
77*977Smax.romanov@gmail.com cl);
78*977Smax.romanov@gmail.com }
79*977Smax.romanov@gmail.com
80*977Smax.romanov@gmail.com jobject
nxt_java_getContextClassLoader(JNIEnv * env)81*977Smax.romanov@gmail.com nxt_java_getContextClassLoader(JNIEnv *env)
82*977Smax.romanov@gmail.com {
83*977Smax.romanov@gmail.com jobject thread;
84*977Smax.romanov@gmail.com
85*977Smax.romanov@gmail.com thread = (*env)->CallStaticObjectMethod(env, nxt_java_Thread_class,
86*977Smax.romanov@gmail.com nxt_java_Thread_currentThread);
87*977Smax.romanov@gmail.com
88*977Smax.romanov@gmail.com if (thread == NULL) {
89*977Smax.romanov@gmail.com return NULL;
90*977Smax.romanov@gmail.com }
91*977Smax.romanov@gmail.com
92*977Smax.romanov@gmail.com return (*env)->CallObjectMethod(env, thread,
93*977Smax.romanov@gmail.com nxt_java_Thread_getContextClassLoader);
94*977Smax.romanov@gmail.com }
95