java - 在静态 block 中加载库是正确的方法吗?

标签 java opencv spring-boot

我通过 Maven 依赖项在我的应用程序中使用 opencv 库。我在应用程序启动时在静态 block 中加载 opencv。不过,我在开发环境中工作并且工作正常。但我想问一下,在静态 block 中加载 opencv 是正确的方法吗?

加载opencv

@SpringBootApplication
@EnableScheduling
public class SamepinchApplication extends SpringBootServletInitializer{

static {
        try{
            nu.pattern.OpenCV.loadShared();
            System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
        }catch(Exception exception){
            System.out.println("Open CV Library could not load due to " + exception.getCause());
        }
    }

 public static void main(String[] args) {
        SpringApplication.run(SamepinchApplication.class, args);
    }

}

Maven 依赖

<dependency>
            <groupId>nu.pattern</groupId>
            <artifactId>opencv</artifactId>
            <version>2.4.9-7</version>
        </dependency>

请帮助我,加载 opencv 或其他 native 库的最佳做法是什么?

最佳答案

在静态 block 中加载 native 库是一种很好的做法。但是,有几件事需要牢记。

一个类只能加载一次(留下偶尔的相应类加载器垃圾收集,这可能会卸载它提供重新加载的机会),所以如果库加载出现问题,您可能必须重新启动 JVM 或以某种方式手动重新加载此类。

例如,如果您在 REST 服务或 Servlet 的静态 block 中加载库,并且由于某种原因没有加载库,您必须重新部署应用程序或重新启动应用程序服务器以重新加载类以运行静态 block 再次尝试。

但是如果库是在静态 block 以外的地方加载的,它可以在服务或 servlet HTTP 方法的下一次调用中加载。 如果库已加载,则多次调用 System.loadLibrary() 不会执行任何操作,因此没有副作用。

综上所述,在我看来,在静态 block 中加载 native 库是可行的方法。

关于java - 在静态 block 中加载库是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33773864/

相关文章:

java - Spring JMS ActiveMQ 消息传递咨询主题不起作用

java - jackson 不匹配输入异常 : No content to map due to end-of-input

java - 父实体的主键未存储为子实体中的外键

java - AutoCompleteTextView onItemSelectedListener 不起作用

java - Eclipse XML 编辑器显示 android1 不是 android 并且没有自动完成

c++ - 在QML VideoOutput中将cv::Mat显示为QVideoFrame

android - Android:使用OpenCV对齐图像

Java 编译器与泛型错误

java - 如何在 Eclipse 控制台中显示 java 对象内容,就像 javascript console.dir() 一样?

opencv - 将具有简单形状的图像转换为多边形