簡體   English   中英

訪問使用OpenCV的C ++共享庫的Java程序

[英]Java program that access C++ shared library that uses OpenCV

我們開發了一個使用OpenCV 2.4的C ++共享庫( libAuxLinuxShared.so

我們還開發了一個命令行Java應用程序,可通過JNI訪問libAuxLinuxShared.so 此應用程序已部署在Ubuntu 14.10中

運行Java應用程序時,我們得到以下結果:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /vagrant/Milan/Linux/libAuxLinuxShared.so: /vagrant/Milan/Linux/libAuxLinuxShared.so: undefined symbol: _ZTVN2cv12_OutputArrayE
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.mi.pixme.PixmeJavaAPI.<clinit>(PixmeJavaAPI.java:8)
    at com.mi.pixme.PixmeCommandRunner.main(PixmeCommandRunner.java:11)

在我看來,制作libAuxLinuxShared.so時OpenCV沒有正確鏈接,或者找不到OpenCV共享庫。 我不是C ++專家,當然不是Linux下的專家,我不確定下一步該怎么做。

更多細節

我試圖通過兩種方式做到這一點:

  1. 將OpenCV設為共享庫

  2. 將OpenCV設為靜態庫,並嘗試將libAuxLinuxShared.so與它們鏈接(使用-l)。 我在Makefile中使用pkg-config --libs --cflags opencv來獲取庫的完整列表。

在兩種情況下,我都得到相同的結果。

注意以下結果可能會有所幫助:

$ nm -D libAuxLinuxShared.so | grep _ZTVN2cv12_OutputArrayE

是:

U _ZTVN2cv12_OutputArrayE

即使我嘗試進行OpenCV的靜態鏈接。 該符號可能在opencv_core庫中定義:

$ nm /usr/local/lib/libopencv_core.so | grep _ZTVN2cv12_OutputArrayE
00000000004b1de0 V _ZTVN2cv12_OutputArrayE

我還嘗試設置LD_LIBRARY_PATH=/usr/local/lib:/usr/local/share/OpenCV/3rdparty/lib (這是OpenCV庫所在的位置),但是結果是相同的。 我嘗試的最后一件事是從Java應用程序加載opencv_core共享庫(我認為_ZTVN2cv12_OutputArrayE所在的庫):

  1. 添加到Java主類:

    System.loadLibrary(“ opencv_core”);

  2. 然后將/usr/local/lib到Java命令的庫路徑,如下所示:

    -Djava.library.path = / usr / local / lib:

但是,同樣的結果。 我可以看到Java程序找到了該庫,因為如果我將opencv_core更改為一個不存在的名稱, opencv_core收到另一個錯誤(找不到該庫)。 但是,當庫名正確時,它對結果沒有影響,這是抱怨_ZTVN2cv12_OutputArrayE未定義的例外。

編輯:以下要點包含我用於構建共享庫的makefile: https : //gist.github.com/yanivby/69984a541e97e33d815a76a9bbf4d712

根據您的要點中的Makefiles,問題似乎是實際依賴那些庫的對象之前提到了pkg-config --libs --cflags opencv ,它向鏈接器添加了一堆-l library參數。 。 在您的Makefile中,最簡單的解決方法是將$(INCLUDES)引用移至命令的末尾$(LIBS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM