草庐IT

java - 添加 jar 作为 Play 项目的依赖项时,IntelliJ 找不到 OpenCV 的 native 库

coder 2024-04-05 原文

我目前正在开发一个 Play 2.1 项目,其中对网络服务的请求将处理下载用户提供的图像、重新调整大小和重新裁剪它们,以及过滤掉已知的不良照片(例如,我们不希望用户上传公司 Logo )。我们正在尝试使用 OpenCV 来处理后端工作,但我似乎无法让 IntelliJ 以适用于 Java 项目的方式添加 OpenCV jar。

我已经能够从源代码构建 OpenCV,没有任何问题。这给我留下了以下文件夹: /home/charles/opencv/release

在此文件夹中,我有三个感兴趣的文件:

  1. bin/opencv-246.jar
  2. lib/cv2.so
  3. lib/libopencv_java246.so

如果我尝试将 jar 文件作为新的 Java 库添加到 IntelliJ,它似乎找到了所有类/方法,并且我可以使用自动完成功能编写代码。我还可以单击相应的类或方法,它会将我带到正确的文件。

但是,当我尝试运行 Play 项目时,出现此错误:

[info] Loading project definition from /home/charles/Github/ImageProject
[info] Set current project to ImageProject (in build file:/home/charles/Github/ImageProject/)

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

Server started, use Alt+D to stop

[info] Compiling 1 Java source to /home/charles/Github/ImageProject/target/scala-2.10/classes...
[error] /home/charles/Github/ImageProject/app/controllers/Application.java:7: error: package org.opencv.core does not exist
[error] import org.opencv.core.Core;
[error]                       ^

我还尝试将 jar 文件的副本直接添加到项目中(因此将 opencv-246.jar 放入 ImageProject/lib 中),然后从该位置添加 java 库。但这只会给我留下一个不同的错误:

java.lang.UnsatisfiedLinkError: no opencv_java246 in java.library.path

我怀疑部分问题可能与 Java OpenCV 包装器使用的 native 库有关(上面的文件 2 或 3)。在 Eclipse 中,当您添加一个 jar 文件时,您可以显式设置 native 库位置,这使得 OpenCV 可以正常工作。我已经阅读了使用它来解决问题的建议:

-Djava.library.path=/home/charles/opencv/release/lib

但这似乎行不通(虽然也许我把它设置在错误的地方?我已经尝试在项目的运行配置和 IDE 设置中将它设置为 JVM 参数,但都没有似乎被使用或尊重)。

注意:再次澄清一下,这是一个 Play2 项目,而不是 Android 项目。那里似乎有一些特定于 Android 的帮助,但与本例无关。

这感觉应该是一件相当直截了当的事情,但我已经花了几天时间试图在这一点上找到答案,但仍然一无所获。有什么想法吗?

其他详细信息: 我还尝试按照此处 OpenCV 文档的“运行 SBT 示例”进行操作: http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html

我也遇到了类似的错误:

charles@charles-VirtualBox:~/JavaSample$ sbt run
[info] Loading project definition from /home/charles/JavaSample/project
[info] Set current project to JavaSample (in build file:/home/charles/JavaSample/)
[info] Compiling 1 Java source to /home/charles/JavaSample/target/scala-2.10/classes...
[info] Running HelloOpenCV 
Hello, OpenCV
[error] (run-main) java.lang.UnsatisfiedLinkError: no opencv_java246 in java.library.path
java.lang.UnsatisfiedLinkError: no opencv_java246 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at HelloOpenCV.main(HelloOpenCV.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
[trace] Stack trace suppressed: run last compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
    at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) Nonzero exit code: 1
[error] Total time: 2 s, completed Jul 17, 2013 5:11:39 PM

最佳答案

当您想在 Playframework 上使用 OpenCV 或任何其他 native 库时,您必须使用“play start”命令而不是“play run”来运行您的应用程序。

“play run”命令在开发模式下启动您的应用程序,“play start”命令在生产模式下启动。我不知道它们之间的每一个区别,但有一点很明显,

只有当我们使用“play start”时,才会为您的应用程序启动一个新的 JVM 并加载您指定的 native 库 System.load("/absolute/path/to/your/so/or/jnilib/inOSX/不是/dylib/文件名.jnilib");

如何加载原生库如下。

创建包名为空的 Global.java。 (引用this link)

public class Global extends GlobalSettings {

    @Override
    public void beforeStart(Application app) {
        // TODO Auto-generated method stub
        super.beforeStart(app);

        String libopencv_java = "/Users/yoonjechoi/git/myFirstApp/target/native_libraries/64bits/libopencv_java246.jnilib";
        System.load(libopencv_java);
    }
}

然后您可以在 Play 应用程序的 Controller 中使用 OpenCV 类。

System.loadLibrary("opencv_java246") 不起作用。我不知道为什么。我没有时间去挖掘为什么。 -_-;

知道原因请指点

关于java - 添加 jar 作为 Play 项目的依赖项时,IntelliJ 找不到 OpenCV 的 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708150/

有关java - 添加 jar 作为 Play 项目的依赖项时,IntelliJ 找不到 OpenCV 的 native 库的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  3. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

随机推荐