2013-07-17 49 views
6

我目前正在開發一個Play 2.1項目,在該項目中,對Web服務的請求將處理下載用戶提供的圖像,重新調整大小和重新裁剪它們,並且還過濾出已知的錯誤照片(例如,我們不希望用戶上傳公司徽標)。我們正在嘗試使用OpenCV來處理後端工作,但我似乎無法讓IntelliJ以與java項目一起使用的方式添加OpenCV jar。當將jar添加爲Play項目的依賴項時,IntelliJ找不到OpenCV的本機庫

我已經能夠從源代碼構建OpenCV,沒有問題。這給我留下了以下文件夾: /首頁/查/ OpenCV的/釋放

此文件夾中,我有興趣三個文件:

  1. 斌/ OpenCV的-246.jar
  2. 的lib/cv2.so
  3. 的lib/libopencv_java246.so

如果我嘗試的jar文件添加到的IntelliJ作爲一個新的Java庫,它似乎發現的所有類/方法,我可以使用AUT編寫代碼鄰完成。我也可以點擊相應的類或方法,並將其帶到正確的文件中。

然而,當我嘗試運行遊戲項目,我得到這個錯誤:

[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 

但是,這似乎並沒有工作(雖然也許我在錯誤的地方設置它,我已經嘗試設置它作爲一個JVM?項目的運行配置中的參數以及IDE設置中的參數,但似乎都未被使用或受到尊重)。

注意:再次澄清一下,這是一個Play2項目,而不是Android項目。似乎有一些Android特定的幫助,在這種情況下不相關。

這感覺應該是一個相當直接的事情,但我已經花了幾天的時間試圖找到答案在這一點上,仍然沒有。有任何想法嗎?

其他細節: 我也試過以下OpenCV的文檔,這裏的 「運行SBT樣本」: http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html

而且我也得到了類似的錯誤:

[email protected]:~/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 
+0

這[錯誤] /home/charles/Github/ImageProject/app/controllers/Application.java:7:錯誤:軟件包org.opencv.core不存在罷工我作爲一個Java CP問題,而不是本地lib問題。我認爲你的SBT配置不正確。 – morpheus05

+0

您是否有過在這種情況下如何配置SBT的例子? –

+0

查看我的回覆http://stackoverflow.com/questions/24856501/how-do-you-link-a-native-library-to-a-jar-in-intellij/37038583#37038583本機庫通常是運行時依賴性,所以你必須指定虛擬機在運行時如何找到它,而不是編譯時的IntelliJ。 –

回答

1

當你想要在Playframework上使用OpenCV或任何其他本機庫,必須使用「play start」命令運行應用程序,而不是「play run」。

「play run」命令以開發模式啓動您的應用程序,「play start」命令以生產模式啓動。我不知道它們之間的每一個區別,但有一點很明顯,

只有當我們使用「play start」時,纔會啓動一個新的JVM for應用程序,它會加載由System.load指定的本地庫(「絕對/路徑/到/你/所以/或/ jnilib/inOSX /不/ dylib/filename.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); 
    } 
} 

那麼您可以在您的播放應用程序的控制器使用的OpenCV類。

System.loadLibrary(「opencv_java246」)不起作用。我不知道爲什麼。我沒有時間去挖掘原因。 -_-;

如果您知道原因,請提供提示。

+0

你是一個救星!我一直在努力解決這個問題好幾天。這絕對有效。至於爲什麼System.loadLibrary不起作用,我認爲它與OpenCV本地庫不在java.library.path中有關(因此它不知道到達文件的絕對路徑)。我猜測有一些小的調整可以使這個工作? –

0

窗戶64位設置

-Djava.library.path = /全路徑/ OpenCV的/生成/ JAVA/X64

0

我會使用的lib/libopencv_java246.so

將.so文件映射到構建庫總是很重要的。這是假設開箱即用

相關問題