6

Ich arbeite gerade an einem Play 2.1-Projekt, bei dem Anfragen an den Web-Service das Herunterladen von vom Benutzer bereitgestellten Bildern, Größenanpassungen und Sie können sie erneut zuschneiden und bekannte fehlerhafte Fotos herausfiltern (zum Beispiel möchten wir nicht, dass Benutzer Firmenlogos hochladen). Wir versuchen, OpenCV zu verwenden, um die Back-End-Arbeit zu behandeln, aber ich kann nicht scheinen, dass IntelliJ das OpenCV-Jar in einer Weise hinzufügt, die mit dem Java-Projekt funktioniert.IntelliJ findet keine nativen Bibliotheken für OpenCV, wenn Sie jar als Abhängigkeit für Play-Projekt hinzufügen

Ich war in der Lage, OpenCV von der Quelle ohne Problem zu bauen. Dies ließ mich mit dem folgenden Ordner: /home/charles/opencv/Release

In diesem Ordner, ich habe drei Dateien von Interesse:

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

Wenn ich versuche, die jAR-Datei zu IntelliJ als eine neue Java-Bibliothek hinzufügen, findet er scheinbar alle Klassen/Methoden, und ich kann Code mit dem aut schreiben o-vollständig. Ich kann auch auf die entsprechenden Klassen oder Methoden klicken und es bringt mich zu den richtigen Dateien.

aber wenn ich versuche, das Play-Projekt auszuführen, ich diesen Fehler:

[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]      ^

Ich habe auch versucht, eine Kopie der JAR-Datei hinzugefügt direkt in das Projekt (so setzt opencv-246. jar in ImageProject/lib) und fügt dann stattdessen die Java-Bibliothek von diesem Ort hinzu. Aber das läßt mich nur mit einem anderen Fehler:

java.lang.UnsatisfiedLinkError: no opencv_java246 in java.library.path 

Ich vermute, dass ein Teil des Problems auf die nativen Bibliotheken in Beziehung gesetzt werden kann, dass die Java OpenCV-Wrapper verwendet (Datei 2 oder 3 oben). Wenn Sie in Eclipse eine JAR-Datei hinzufügen, können Sie den Speicherort der systemeigenen Bibliothek explizit festlegen, wodurch OpenCV funktioniert. Ich habe Vorschläge zur Verwendung dieses lesen, das Problem zu beheben:

-Djava.library.path=/home/charles/opencv/release/lib 

Aber das scheint nicht zu funktionieren (wenn auch vielleicht bin ich es an der falschen Stelle Einstellung Ich habe versucht, es als eine JVM Einstellung? Parameter in der Run-Konfiguration für das Projekt und in den IDE-Einstellungen, aber keiner scheint verwendet oder respektiert zu werden).

Hinweis: Nur zur Verdeutlichung, dies ist ein Play2-Projekt, kein Android-Projekt. Es scheint eine gewisse Android-spezifische Hilfe zu geben, die in diesem Fall nicht relevant ist.

Das fühlt sich an, als ob es eine ziemlich geradlinige Sache sein sollte, aber ich habe mehrere Tage damit verbracht, eine Antwort zu finden, und habe immer noch nichts. Irgendwelche Ideen?

Weitere Details: Ich habe auch versucht, im Anschluss an die "Running SBT-Proben" der OpenCV-Dokumentation hier: http://docs.opencv.org/doc/tutorials/introduction/desktop_java/java_dev_intro.html

Und ich bekomme auch einen ähnlichen Fehler:

[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

Das [Fehler] /home/charles/Github/ImageProject/app/controllers/Application.java:7: Fehler: Paket org.opencv.core existiert nicht, schlägt mich als ein Java cp Problem eher als ein natives lib-Problem. Ich denke, Ihre SBT ist nicht richtig konfiguriert. – morpheus05

+0

Haben Sie ein Beispiel dafür, wie die SBT in diesem Fall konfiguriert werden soll? –

+0

Siehe meine Antwort auf http://stackoverflow.com/questions/24856501/how-do-you-link-a-native-library-to-a-jar-in-intellij/37038583#37038583 die native Bibliothek ist in der Regel ein Laufzeitabhängigkeit und so müssen Sie angeben, wie die VM es zur Laufzeit findet, nicht IntelliJ zur Kompilierzeit. –

Antwort

1

Wenn Sie möchten, Um OpenCV oder andere native Bibliotheken auf Playframework zu verwenden, MÜSSEN Sie Ihre Anwendung mit dem Befehl "play start" starten, nicht mit "play run".

Der Befehl "play run" startet Ihre Anwendung im Entwicklungsmodus und der Befehl "play start" startet im Produktionsmodus. Ich weiß nicht jeden Unterschied zwischen ihnen, aber eine offensichtliche Sache ist,

Nur wenn wir "Play Start" verwenden, wird eine neue JVM für Sie-Anwendung gestartet und lädt native Bibliotheken, die Sie von System.load ("/ absolut/Pfad/zu/Ihrem/so/oder/jnilib/inOSX/nicht/dylib/Dateiname.jnilib ");

Wie native lib folgt folgt.

Erstellen Sie Global.java mit einem leeren Paketnamen. (Siehe 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); 
    } 
} 

dann können Sie Klassen von OpenCV verwenden in Ihrer Play-Anwendung-Controller.

System.loadLibrary ("opencv_java246") funktioniert nicht. Ich weiß nicht warum. Ich habe keine Zeit zu graben, warum. -_-;

Bitte geben Sie Hinweise, wenn Sie wissen, warum.

+0

Sie sind ein Lebensretter! Ich habe seit Tagen mit diesem Problem zu kämpfen. Das funktioniert definitiv. Warum System.loadLibrary nicht funktioniert, glaube ich, dass es etwas damit zu tun hat, dass sich die native OpenCV-Bibliothek nicht in java.library.path befindet (daher weiß sie nicht den absoluten Pfad, um die Datei zu erreichen). Ich nehme an, es gibt ein paar kleine Verbesserungen, die gemacht werden können, um das zum Laufen zu bringen? –

0

für Windows 64-Bit gesetzt

-Djava.library.path =/full-Pfad/OpenCV/build/java/x64

0

ich die lib verwendet haben würde/libopencv_java246.so

Es ist immer wichtig, die .so-Datei zuzuordnen, um eine Bibliothek zu erstellen. Es wird angenommen, aus der Box zu arbeiten

Verwandte Themen