2016-05-02 6 views

Antwort

0

Ihre Bibliothek verwendet das Symbol cv::String::allocate(unsigned long).

Sie müssen die richtigen gemeinsamen Objekte laden, die die Symbole bereitstellen, von denen Ihr systemeigener Code abhängt. Der beste Weg, dies zu tun, besteht darin, Ihr natives Shared-Objekt so zu kompilieren, dass es dynamische Abhängigkeiten von diesen Objekten besitzt, indem Sie die richtigen -L library_name -Option (en) verwenden.

1

Ich vermute, dass Sie eine Versionskonflikt zwischen den Java JNI-Bindungen und Ihre Version von opencv haben.

Das undefinierte Symbol: _ZN2cv6String8allocateEm entsteht, weil Ihr libJavaFileName.so einen Verweis auf dieses Symbol enthält, aber der Linker keine Objektdatei finden kann, die es definiert.

können Sie das Programm C++ filt verwenden Sie das Symbol in einen lesbaren Namen unmangle:

> c++filt -n _ZN2cv6String8allocateEm 
cv::String::allocate(unsigned long) 

Wenn Sie in der Quelle opencv sehen 3.1 Sie sehen, dass diese Funktion in der Tat existiert (sein in stl.cpp im Kernmodul).

Das Symbol ist nicht in den Bibliotheken für opencv auf meinem Computer (Version 2.4.8) definiert, aber es ist in libopencv_core.so definiert, wenn ich Version 3.1 von der Quelle erstelle.

Daher vermute ich, es ist wahrscheinlich der Fall, dass Sie eine neuere Version von opencv installieren müssen.

Es lohnt sich auch zu überprüfen, dass es tatsächlich die Version der freigegebenen Bibliothek lädt, die Sie denken, dass es ist. Wenn Sie das tun:

strace -o log.txt java rest_of_your_command_line 

Dann können Sie durch log.txt schauen, um zu sehen, welche gemeinsam genutzten Bibliotheken geöffnet werden. Versuchen Sie, diese Datei für opencv zu überschreiben, um zu sehen, ob die richtige Version geladen wird.

+0

Vielen Dank für Ihre Antwort, aber ich habe opencv 3.1, die neueste Version. – user5388874

+0

OK. Ich frage mich, ob Sie zwei Versionen installiert haben und nicht die neue finden? Ich habe oben einen Hinweis hinzugefügt, um zu überprüfen, welche Shared Library geladen wird –