diff --git a/be/src/util/jni-util.cpp b/be/src/util/jni-util.cpp index 1293c55576..c1ea26798b 100644 --- a/be/src/util/jni-util.cpp +++ b/be/src/util/jni-util.cpp @@ -374,12 +374,11 @@ Status JniUtil::init_jni_scanner_loader(JNIEnv* env) { return Status::OK(); } -Status JniUtil::get_jni_scanner_class(JNIEnv* env, std::string classname, +Status JniUtil::get_jni_scanner_class(JNIEnv* env, const char* classname, jclass* jni_scanner_class) { // Get JNI scanner class by class name; - jobject loaded_class_obj = - env->CallObjectMethod(jni_scanner_loader_obj_, jni_scanner_loader_method_, - env->NewStringUTF(classname.c_str())); + jobject loaded_class_obj = env->CallObjectMethod( + jni_scanner_loader_obj_, jni_scanner_loader_method_, env->NewStringUTF(classname)); RETURN_ERROR_IF_EXC(env); *jni_scanner_class = reinterpret_cast(env->NewGlobalRef(loaded_class_obj)); RETURN_ERROR_IF_EXC(env); diff --git a/be/src/util/jni-util.h b/be/src/util/jni-util.h index 15649b8efc..faa79c9133 100644 --- a/be/src/util/jni-util.h +++ b/be/src/util/jni-util.h @@ -74,7 +74,7 @@ public: static inline int64_t IncreaseReservedBufferSize(int n) { return INITIAL_RESERVED_BUFFER_SIZE << n; } - static Status get_jni_scanner_class(JNIEnv* env, std::string classname, jclass* loaded_class); + static Status get_jni_scanner_class(JNIEnv* env, const char* classname, jclass* loaded_class); static jobject convert_to_java_map(JNIEnv* env, const std::map& map); static std::map convert_to_cpp_map(JNIEnv* env, jobject map); diff --git a/be/src/vec/exec/jni_connector.cpp b/be/src/vec/exec/jni_connector.cpp index 5bac2759f0..bad7f52cc3 100644 --- a/be/src/vec/exec/jni_connector.cpp +++ b/be/src/vec/exec/jni_connector.cpp @@ -201,7 +201,8 @@ Status JniConnector::close() { } Status JniConnector::_init_jni_scanner(JNIEnv* env, int batch_size) { - RETURN_IF_ERROR(JniUtil::get_jni_scanner_class(env, _connector_class, &_jni_scanner_cls)); + RETURN_IF_ERROR( + JniUtil::get_jni_scanner_class(env, _connector_class.c_str(), &_jni_scanner_cls)); if (_jni_scanner_cls == NULL) { if (env->ExceptionOccurred()) env->ExceptionDescribe(); return Status::InternalError("Fail to get JniScanner class."); diff --git a/be/src/vec/exec/vjdbc_connector.cpp b/be/src/vec/exec/vjdbc_connector.cpp index f9181c559a..73dc0a9117 100644 --- a/be/src/vec/exec/vjdbc_connector.cpp +++ b/be/src/vec/exec/vjdbc_connector.cpp @@ -119,8 +119,7 @@ Status JdbcConnector::open(RuntimeState* state, bool read) { JNIEnv* env = nullptr; RETURN_IF_ERROR(JniUtil::GetJNIEnv(&env)); - RETURN_IF_ERROR(JniUtil::GetGlobalClassRef(env, JDBC_EXECUTOR_CLASS, &_executor_clazz)); - + RETURN_IF_ERROR(JniUtil::get_jni_scanner_class(env, JDBC_EXECUTOR_CLASS, &_executor_clazz)); GET_BASIC_JAVA_CLAZZ("java/util/List", list) GET_BASIC_JAVA_CLAZZ("java/lang/Object", object) GET_BASIC_JAVA_CLAZZ("java/lang/String", string) diff --git a/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/JniScannerClassLoader.java b/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/JniScannerClassLoader.java index 12105546cf..1e6be07e09 100644 --- a/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/JniScannerClassLoader.java +++ b/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/JniScannerClassLoader.java @@ -25,8 +25,8 @@ public class JniScannerClassLoader extends URLClassLoader { private final String scannerName; - public JniScannerClassLoader(String scannerName, List urls) { - super(urls.toArray(new URL[0]), ClassLoader.getSystemClassLoader()); + public JniScannerClassLoader(String scannerName, List urls, ClassLoader parent) { + super(urls.toArray(new URL[0]), parent); this.scannerName = scannerName; } diff --git a/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/ScannerLoader.java b/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/ScannerLoader.java index 726a0dbe0e..c21b6bf0a7 100644 --- a/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/ScannerLoader.java +++ b/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/classloader/ScannerLoader.java @@ -52,7 +52,8 @@ public class ScannerLoader { File library = new File(basePath, "/lib/java_extensions/"); // TODO: add thread pool to load each scanner listFiles(library).stream().filter(File::isDirectory).forEach(sd -> { - JniScannerClassLoader classLoader = new JniScannerClassLoader(sd.getName(), buildClassPath(sd)); + JniScannerClassLoader classLoader = new JniScannerClassLoader(sd.getName(), buildClassPath(sd), + this.getClass().getClassLoader()); try (ThreadClassLoaderContext ignored = new ThreadClassLoaderContext(classLoader)) { loadJarClassFromDir(sd, classLoader); }