Autor Wątek: JNI a natywna obiektowa biblioteka  (Przeczytany 1261 razy)

Offline Solgar

  • Użytkownik

# Listopad 14, 2009, 02:37:04
Lubie Javę za swoją prostotę i jednocześnie możliwości jakie daje. Lubie też pewną bibliotekę, która jest napisana w C++. I tu pojawia się problem, bo aby jej używać muszę korzystać z C++ którego nie lubię/nie umiem. Z racji tego, że nic wielkiego nie mam zamiaru pisać a jedynie zająć się prototypowaniem różnych form gameplayu nie jest to zbyt mocny bodziec dla mnie do nauki C++. W ten sposób zainteresowałem się JNI, który pozwolił by (teoretycznie) na bezproblemowe korzystanie z natywnej biblioteki z poziomu programu napisanego w Java. JNI pozwala na wymianę informacji pomiędzy instancją JVM a C/C++. Z poziomu natywnego kodu mogę odbierać obiekty Java jako parametry metod, moge zmieniać ich pola, wywoływać na nich metody i zwracać różne wartości. Wszystko jak narazie fajnie. Problem pojawia się w momencie, w którym chcę stworzyć z poziomu Java obiekt C++. Mogę (i powinienem) zwrapować klasę C++ w klasę Java aby się w przystępny sposób z niej korzystało. Problemem dla mnie jest zarządzanie pamięcią. W klasie Java podczas tworzenia obiektu mogę ustawić prywatne pole int na wartość zwracaną przez new w natywnym kodzie i w ten sposób przy odwołaniach z poziomu Java wiedzieć do jakiego natywnego obiektu się dobrać. Życie obiektów w Java jest zarządzane przez maszynę wirtualną, ale w C++ zaalokowaną pamięć przez new należy uwolnić. Jedynym wyjściem tutaj jak dla mnie jest dodanie metody destroy() do każdej klasy Java wrapującej klasę C++.  Taka metoda wywoływała by natywne uwalnianie obiektu i ustawiała pole klasy trzymającej wartość wskaźnika na zero. Dodatkowo trzeba by było ustawić referencje w Java na null. Takie rozwiązanie wprowadza jawne zarządzanie pamięcią i może powodować wiele wycieków pamięci po stronie natywnej. Z takim podejściem da się osiągnąć cel, ale rozwiązanie średnio mi się podoba. W sumie wygląda na to, że nie ma innej możliwości... No właśnie. Czy jest jakaś inna możliwość zarządzaniem pamięci w takim przypadku jaki opisałem? Czy mieliście styczność z Javą sprzężoną z natywnymi bibliotekami napisanymi obiektowo poprzez JNI? Wszelkie porady, sugestie mile widziane :).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Solgar

  • Użytkownik

# Listopad 14, 2009, 12:26:32
Rozwiązaniem mojego problemu jest java.lang.Object.finalize() wywoływane na obiekcie przez GC, kiedy nie ma już do niego żadnych referencji. Coś w stylu destruktora w Java. LINK