2013-04-29 76 views
2

在eclipse中導出時,我選擇「將所需的庫打包到生成的jar中」。 該jar文件只能在我的機器上運行。然而,當我測試了其他機器上給出了這樣的例外:導出使用opencv的可執行jar文件

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681) 
at java.lang.Runtime.loadLibrary0(Runtime.java:840) 
at java.lang.System.loadLibrary(System.java:1047) 
at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593) 
at com.googlecode.javacpp.Loader.load(Loader.java:489) 
at com.googlecode.javacpp.Loader.load(Loader.java:431) 
at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136) 
at mains.<clinit>(mains.java:25) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:266) 
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56) 

回答

4

簡短的回答

您必須安裝OpenCV(如JavaCV requirements提到的)和JavaCV系統上才能使用JavaCV。正如你可能在你的計算機上安裝它們進行開發,應用程序工作,但另一臺機器可能沒有安裝它們,因此jar不起作用。

龍答案

問題是不是JavaCV庫,它似乎正確納入您的jar如圖中的臺詞:

at com.googlecode.javacpp.Loader.loadLibrary(Loader.java:593) 
at com.googlecode.javacpp.Loader.load(Loader.java:489) 
at com.googlecode.javacpp.Loader.load(Loader.java:431) 
at com.googlecode.javacv.cpp.opencv_core.<clinit>(opencv_core.java:136) 

事實是JavaCV是建立在OpenCV的頂部。 OpenCV是一個C++庫,從Java使用它的唯一方法是使用JNI調用。

JNI需要兩個組件:

  • 一個Java庫(通常使用擴展名*.jar)包含Java方法調用本機庫
  • 本機庫(通常是用擴展*.so爲Linux或*.dll窗戶),該「做工作」,在這種情況下「使用OpenCV庫」

第一個是由JavaCV提供,納入您的應用程序jar。第二個依賴於系統(Os,architecture,...),並且必須放入java庫路徑中。

這是實際的錯誤:它找不到libjniopencv_core.sojava.library.pathjniopencv_core庫也由JavaCV提供,但安裝在系統的某個位置(例如,/usr/lib/),因此不包含在最終的jar中。

即使您找到將其包含在最終應用程序中的方法,該庫也需要使用系統上未安裝的OpenCV庫。總結需求:

  1. JavaCV Java庫,將調用(用JNI):
  2. JavaCV本地庫,將使用:
  3. OpenCV的庫,真的會做工作。

沒有這一點,應用程序將無法正常工作。因此OpenCV和JavaCV必須安裝到系統中。

+1

在我的系統中,安裝了OpenCV。一旦我嘗試從eclipse運行該項目,一切正常。但是當我嘗試從runnabelJar執行相同的操作時,它不會。 我發現這個問題,我沒有包括.dll文件,所以我應該怎麼做。 – 2013-10-01 05:20:42

+0

面對同樣的問題。請幫忙 – slaveCoder 2014-04-01 04:55:26

+0

@ABC http://stackoverflow.com/a/19202226/1847899 – 2014-09-26 10:08:09