添加 jar 作为 Play 项目的依赖项时,IntelliJ 找不到 OpenCV 的本机库

2024-02-22

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

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

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

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

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

但是,当我尝试运行 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 包装器使用的本机库有关(上面的文件 2 或 3)。在 Eclipse 中,当您添加 jar 文件时,您可以显式设置本机库位置,这使得 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 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 或任何其他本机库时,您必须使用“play start”命令运行应用程序,而不是“play run”。

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

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

如何加载本机库如下。

创建包名称为空的 Global.java。 (参考这个链接 http://www.playframework.com/documentation/2.1.x/JavaGlobal )

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 应用程序的控制器中使用 OpenCV 的类。

System.loadLibrary(“opencv_java246”)不起作用。我不知道为什么。我没有时间去探究为什么。 -_-;

如果您知道原因请给予提示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加 jar 作为 Play 项目的依赖项时,IntelliJ 找不到 OpenCV 的本机库 的相关文章

  • 如何在 IntelliJ 中快速文档中换行文本?

    Ctrl Q 快速文档 后我看不到所有文本 我必须水平滚动才能看到所有内容 我无法使编辑器适合窗口 更新 问题只是符号定义 即 第一行 描述 块文本 正确换行 实际上 我不想调整此窗口的大小 因为我更喜欢将其保留在相同的位置以便快速参考 我
  • java格式化表格输出

    所以我正在尝试格式化我的输出 System out println Menu nItem tItem t tPrice tQuantity for int i 0 i
  • java中使用awt.Toolkit和Clipboard是否可以知道剪贴板中复制的内容是否是mp3文件

    我正在尝试编写一个运行于背景 and monitors复制 a 的复制操作 mp3 file or a 文件夹包含 a mp3 file Clipboard cb Toolkit getDefaultToolkit getSystemCli
  • JAR 清单代码库不匹配

    我在 dropbox 中有一个小程序 在 droppages 中有一个链接 该小程序是自签名的 按照代码操作 Manifest Version 1 0 Ant Version Apache Ant 1 9 1 X COMMENT Main
  • java:查找数组中整数的频率

    我需要开发一个java要求用户输入一些内容的程序integers并找出最大和最小的数 以及这些数的平均值 然后 划分数组的集合分成若干子区间用户指定的 然后它生成一个边界点 每个边界点的长度为子区间宽度 问题是我需要创建一个频率 例如 间隔
  • java列表中的addAll方法

    我一直在研究java中的addAll方法 但这让我感到奇怪 到底有什么区别public void addAll List
  • 相机 java.lang.RuntimeException:setParameters 失败

    我使用创建了一个自定义相机应用程序this https github com davidgatti dgCam源代码 但在少数设备上 例如高分辨率设备 我得到 RuntimeException setParameters failed 我面
  • 如何在MongoDb中保存Timestamp类型值 |爪哇

    从 Java 驱动程序中 我想在 MongoDb 中保存一个类似于下面 json 的文档 ts Timestamp 1421006159 4 我尝试过的选项 选项1 映射 doc new HashMap 1 doc put ts new B
  • 如何使用 unboundid-ldap-sdp 导入 ldif 文件?

    我从 LDAP 服务器导出了以下 ldif 文件 现在尝试导入它 以便可以复制从中导出它的目录 dn cn MYCOMPANY Users dc mycompany dc com changetype add objectClass pos
  • 从 Android Intent 打开图库应用

    我正在寻找一种打开方式Android来自意图的画廊应用程序 我不想返回图片 而是只是打开图库以允许用户使用它 就像他们从启动器中选择它一样 View pictures folders 我尝试执行以下操作 Intent intent new
  • 如何在 IDE 中输入提示上下文?

    我在用Closure call http php net manual en closure call php http php net manual en closure call php 在类上下文中调用外部闭包 这是一个简单的重现 c
  • 无法加载(查找)j2v8_android_x86 库

    我有一个使用的 gradle 项目j2v8 android 2 2 1 http mvnrepository com artifact com eclipsesource j2v8 j2v8 android 2 2 1库 为 V8 JS 引
  • 如何在另一个 Gui 中启动 JADE Gui?

    如何在另一个 Gui 中启动 JADE Gui 假设我的 Gui 上有一个按钮 点击该按钮后 JADE Gui 将启动 这可能吗 如果是 怎么办 提前致谢 Regards 我假设 JADE Gui 你指的是 JADERMA http jad
  • 使用 Android 将文本文件上传到 Google Drive

    编辑 我已将文本设置为字符串 如下所示 字符串文本 你好 我想将其转换为纯文本文件 然后上传到 Google 云端硬盘文件夹 我已经尝试过下面的代码 但它不完整 所以我无法说出出现了什么错误 我正在使用 Google Drive 快速启动
  • Calendar.getActualMaximum(Calendar.WEEK_OF_YEAR) 怪异

    要么我不明白这个方法getActualMaximum int 或字段 WEEK OF YEAR 或者涉及 Sun bug 或全部三个 有人可以向我解释为什么吗 至少在德国语言环境中 以下代码 Locale setDefault Locale
  • 源单元“_BuildScript_”中“语义分析”阶段出现异常

    评估根项目 android 时出现问题 配置项目 app 时出现问题 无法打开构建文件 C Users InFED Laptop Documents GitHub sustain and save android app build gra
  • 覆盖 VK_Tab 焦点操作

    再会 我正在向 jTextField 添加 keyevent 侦听器 以便如果用户按下 Tab 键 插入符号位置将转到 jtextField 内文本的末尾 这是我的代码 private void jTextField1KeyPressed
  • TextView 用字母打乱了我的话

    我的要求 创建 传入气泡 其宽度按内容排列 最大宽度为 90 我有这个标记
  • 在java中使用共享密钥加密/解密?

    我有客户令牌 我正在从一个 Web 应用程序 如 app1 发送到另一个 Web 应用程序 如 app2 我想加密客户令牌 在 app1 上 并使用在 app1 和 app2 上共享的密钥在 app2 上对其进行解密 我不知道如何开始 这将
  • Java无限信号量

    想知道如何not使用信号量限制连接 或任何东西 所以你可能会想 这听起来很愚蠢 但是 它稍微简化了我的代码 因为它让我可以统一处理有限和无限的情况 请注意 我并不是在寻找有关如何编写类似内容的建议 if limited semaphore

随机推荐