33// can be found in the LICENSE file.
44
55#include " jni_util.h"
6- #include " client_handler.h"
6+
7+ #include < algorithm>
78#include < jawt.h>
9+
10+ #include " client_handler.h"
811#include " util.h"
912
1013namespace {
1114
1215JavaVM *g_jvm = NULL ;
1316
17+ jobject g_javaClassLoader = NULL ;
18+
1419} // namespace
1520
1621void SetJVM (JavaVM* jvm) {
@@ -57,6 +62,32 @@ void DetachFromThread(bool *mustDetach) {
5762 g_jvm->DetachCurrentThread ();
5863}
5964
65+ void SetJavaClassLoader (JNIEnv *env, jobject javaClassLoader) {
66+ ASSERT (!g_javaClassLoader);
67+ g_javaClassLoader = env->NewGlobalRef (javaClassLoader);
68+ }
69+
70+ jclass FindClass (JNIEnv* env, const char * class_name) {
71+ ASSERT (g_javaClassLoader);
72+
73+ std::string classNameSeparatedByDots (class_name);
74+ std::replace (classNameSeparatedByDots.begin (), classNameSeparatedByDots.end (), ' /' , ' .' );
75+
76+ jstring classNameJString = env->NewStringUTF (classNameSeparatedByDots.c_str ());
77+ jobject result = NULL ;
78+
79+ JNI_CALL_METHOD (env, g_javaClassLoader,
80+ " loadClass" ,
81+ " (Ljava/lang/String;)Ljava/lang/Class;" ,
82+ Object,
83+ result,
84+ classNameJString);
85+
86+ env->DeleteLocalRef (classNameJString);
87+
88+ return static_cast <jclass>(result);
89+ }
90+
6091jobject NewJNIObject (JNIEnv* env, jclass cls) {
6192 jmethodID initID = env->GetMethodID (cls, " <init>" , " ()V" );
6293 if (initID == 0 ) {
@@ -74,15 +105,15 @@ jobject NewJNIObject(JNIEnv* env, jclass cls) {
74105}
75106
76107jobject NewJNIObject (JNIEnv* env, const char * class_name) {
77- jclass cls = env-> FindClass (class_name);
108+ jclass cls = FindClass (env, class_name);
78109 if (!cls)
79110 return NULL ;
80111
81112 return NewJNIObject (env, cls);
82113}
83114
84115jobject NewJNIObject (JNIEnv* env, const char * class_name, const char * sig, ...) {
85- jclass cls = env-> FindClass (class_name);
116+ jclass cls = FindClass (env, class_name);
86117 if (!cls)
87118 return NULL ;
88119
@@ -213,7 +244,7 @@ jobject NewJNICookie(JNIEnv* env, const CefCookie& cookie) {
213244CefCookie GetJNICookie (JNIEnv* env, jobject jcookie) {
214245 CefCookie cookie;
215246
216- jclass cls = env-> FindClass (" org/cef/network/CefCookie" );
247+ jclass cls = FindClass (env, " org/cef/network/CefCookie" );
217248 if (!cls)
218249 return cookie;
219250
@@ -271,7 +302,7 @@ CefMessageRouterConfig GetJNIMessageRouterConfig(JNIEnv* env, jobject jConfig) {
271302 if (jConfig == NULL )
272303 return config;
273304 jclass cls =
274- env-> FindClass (" org/cef/browser/CefMessageRouter$CefMessageRouterConfig" );
305+ FindClass (env, " org/cef/browser/CefMessageRouter$CefMessageRouterConfig" );
275306 if (cls == NULL )
276307 return config;
277308
@@ -362,7 +393,7 @@ jobjectArray NewJNIStringArray(JNIEnv* env,
362393 if (vals.empty ())
363394 return NULL ;
364395
365- jclass cls = env-> FindClass (" java/lang/String" );
396+ jclass cls = FindClass (env, " java/lang/String" );
366397 if (!cls)
367398 return NULL ;
368399
@@ -524,7 +555,7 @@ bool CallJNIMethodC_V(JNIEnv* env, jclass cls, jobject obj,
524555CefPageRange GetJNIPageRange (JNIEnv* env, jobject obj) {
525556 CefPageRange range;
526557
527- jclass cls = env-> FindClass (" org/cef/misc/CefPageRange" );
558+ jclass cls = FindClass (env, " org/cef/misc/CefPageRange" );
528559 if (!cls)
529560 return range;
530561
@@ -537,7 +568,7 @@ CefPageRange GetJNIPageRange(JNIEnv* env, jobject obj) {
537568}
538569
539570jobject NewJNIPageRange (JNIEnv* env, const CefPageRange& range) {
540- jclass cls = env-> FindClass (" org/cef/misc/CefPageRange" );
571+ jclass cls = FindClass (env, " org/cef/misc/CefPageRange" );
541572 if (!cls)
542573 return NULL ;
543574
@@ -557,7 +588,7 @@ jobject NewJNIPageRange(JNIEnv* env, const CefPageRange& range) {
557588CefSize GetJNISize (JNIEnv* env, jobject obj) {
558589 CefSize size;
559590
560- jclass cls = env-> FindClass (" java/awt/Dimension" );
591+ jclass cls = FindClass (env, " java/awt/Dimension" );
561592 if (!cls)
562593 return size;
563594
@@ -572,7 +603,7 @@ CefSize GetJNISize(JNIEnv* env, jobject obj) {
572603CefRect GetJNIRect (JNIEnv* env, jobject obj) {
573604 CefRect rect;
574605
575- jclass cls = env-> FindClass (" java/awt/Rectangle" );
606+ jclass cls = FindClass (env, " java/awt/Rectangle" );
576607 if (!cls)
577608 return rect;
578609
@@ -589,7 +620,7 @@ CefRect GetJNIRect(JNIEnv* env, jobject obj) {
589620}
590621
591622jobject NewJNIRect (JNIEnv* env, const CefRect& rect) {
592- jclass cls = env-> FindClass (" java/awt/Rectangle" );
623+ jclass cls = FindClass (env, " java/awt/Rectangle" );
593624 if (!cls)
594625 return NULL ;
595626
@@ -613,7 +644,7 @@ jobjectArray NewJNIRectArray(JNIEnv* env,
613644 if (vals.empty ())
614645 return NULL ;
615646
616- jclass cls = env-> FindClass (" java/awt/Rectangle" );
647+ jclass cls = FindClass (env, " java/awt/Rectangle" );
617648 if (!cls)
618649 return NULL ;
619650
@@ -629,7 +660,7 @@ jobjectArray NewJNIRectArray(JNIEnv* env,
629660}
630661
631662bool GetJNIPoint (JNIEnv* env, jobject obj, int * x, int * y) {
632- jclass cls = env-> FindClass (" java/awt/Point" );
663+ jclass cls = FindClass (env, " java/awt/Point" );
633664 if (!cls)
634665 return false ;
635666
@@ -643,7 +674,7 @@ bool GetJNIPoint(JNIEnv* env, jobject obj, int* x, int* y) {
643674
644675// Create a new java.awt.Point.
645676jobject NewJNIPoint (JNIEnv* env, int x, int y) {
646- jclass cls = env-> FindClass (" java/awt/Point" );
677+ jclass cls = FindClass (env, " java/awt/Point" );
647678 if (!cls)
648679 return NULL ;
649680
@@ -666,7 +697,7 @@ CefSettings GetJNISettings(JNIEnv* env, jobject obj) {
666697 if (!obj)
667698 return settings;
668699
669- jclass cls = env-> FindClass (" org/cef/CefSettings" );
700+ jclass cls = FindClass (env, " org/cef/CefSettings" );
670701 if (!cls)
671702 return settings;
672703
@@ -782,7 +813,7 @@ jobjectArray GetAllJNIBrowser(JNIEnv* env, jobject jclientHandler) {
782813}
783814
784815jobject GetJNIEnumValue (JNIEnv* env, const char * class_name, const char * enum_valname) {
785- jclass sourceCls = env-> FindClass (class_name);
816+ jclass sourceCls = FindClass (env, class_name);
786817 if (!sourceCls)
787818 return NULL ;
788819
0 commit comments