Mat-Objekt kann in Java nicht freigegeben werden

8

Ich versuche, Mat object von C ++ mit JNI an Java zu übergeben. Ich habe in den Quellcode von OpenCV Java dll geschaut, und ich verwende genau denselben Code, den OpenCV verwendet. Wenn ich ein Mat -Objekt aus Java freigeben will, das von OpenCV Java API erstellt wird, funktioniert es gut, aber wenn ich ein Mat -Objekt freigeben will, das ich mit dem gleichen Code erstellt habe, stürzen meine Anwendungen ab.

Ich poste die Codes, die ich verwende. Ich würde sehr geschätzt werden, wenn jemand eine Idee hat. Vielen Dank im Voraus.

[EDIT]

Auch möchte ich noch eine Bemerkung hinzufügen, wenn Sie sich die Codebausteine ​​3 und 4 anschauen. Funktionsdefinitionen in Java und C ++ Seiten haben die gleichen Funktionsnamen, readImage0 , aber in 1 und 2 in C ++ Der Seitenfunktionsname hat eine zusätzliche 1 für seinen Namen, imread_11 und imread_1 . Wie werden diese beiden verknüpft? Vielleicht gibt es eine zusätzliche Ebene, die mir nicht bekannt ist.

[/ EDIT]

[EDIT2]

Unter Windows 7, VC11, versuchten beide mit OpenCV 2.4.5 und 2.4.8

[/ EDIT2]

1. Dies ist der C ++ - Code, der das Objekt Mat in der OpenCV-Quelle übergeben soll:

%Vor%

2. Dies ist der Java-Code in der OpenCV-Quelle:

%Vor%

3. Dies ist mein Code:

%Vor%

4. Dies ist mein Java-Code:

%Vor%

5. So laufe ich den Code:

%Vor%

6. Dies ist, was in Ausnahme geschrieben wird:

%Vor%

7. Dies ist, was in Absturzbericht geschrieben wird:

%Vor%     
guneykayim 21.03.2014, 09:44
quelle

1 Antwort

3

Ich habe herausgefunden, was das Problem ist. Ich denke, es ist irgendwie kompliziert, zumindest war es für mich.

Das Problem ist, dass ich opencv_java248.dll verwendet habe, das mit OpenCV verteilt und bereits kompiliert wurde. opencv_java248.dll ist statisch aufgebaut, was bedeutet, dass es keine der OpenCV-DLLs (opencv_core248.dll, etc.) benötigt, nachdem es kompiliert wurde. Und ich habe meine eigene DLL opencvcpp2java.dll erstellt, die auch statisch aufgebaut ist, so dass sie während der Laufzeit keine der DLLs benötigt.

Nachdem ich die Abstürze bekommen habe, habe ich angefangen darüber nachzudenken, was dieses Problem verursachen könnte. Dann habe ich festgestellt, dass Speicherzuweisung und Freigabe von Speicher auf völlig anderen DLLs erfolgt . Ich habe Speicher mit opencvcpp2java.dll zugewiesen und erwartet opencv_java248.dll, es zu veröffentlichen. Und wenn es versucht hat es zu veröffentlichen, stürzt das Programm ab. Auf der anderen Seite, wenn ich sowohl die Zuweisung und Freigabe mit opencv_java248.dll tun, gab es kein Problem. Also, als Intuition dachte ich, dass Zuteilung und Freigabe auf der gleichen DLL erfolgen sollte.

Nach dieser Intuition habe ich opencv_java248.dll selbst kompiliert (übrigens müssen Sie alle OpenCV-DLLs kompilieren, es ist ein Kinderspiel, wenn Sie CMake verwenden) und es von anderen OpenCV-DLLs abhängig machen und opencvcpp2java neu kompilieren. dll und machen es auch abhängig von OpenCV dll's. Wenn ich also Speicher mit opencvcpp2java.dll zuweisen will, wird Speicher mit OpenCV-DLLs (genauer: opencv_core248.dll) zugewiesen, und wenn ich Speicher freigeben möchte, benutze opencv_java248.dll Es hebt die Speicherbelegung auf, indem dieselbe DLL verwendet wird, damit sie erstellt wird.

Ich bin nicht 100% sicher, dass dies die richtige Lösung ist, aber es hat für mich funktioniert.

    
guneykayim 04.04.2014, 06:13
quelle

Tags und Links