Zawsze piszę, o muzyce, Kolumbii czy życiu, a dziś napiszę o czymś innym…
Ostatnio dostaliśmy do wdrożenia moduł napisany w Javie w naszym systemie pisanym cały czas w .NETcie. Może, odkrywam „Amerykę w konserwach”, ale zawsze na mnie spada jej ponowne odkrycie. Jednakże, jak ktoś jeszcze nie odkrył to dla niego niech będzie ten wpis.
Ze znanych mi sposobów było:
– IKVM – wirtualna maszyna Javy napisana w .NET używająca OpenJDK. Idealna, ale prawie… No właśnie, prawie. Z posiadanego JARa nie sposób było wykonać kodu.
– ActiveX Bridge – użycie Javy jako kontrolki ActiveX. Problem pojawił się, że otrzymana/wygenerowana DLLka musiała być w dokładnie ustawionym miejscu, więc użycie spod <jre_home>\axbridge\bin kończyło się biednym Exceptionem.
I w tym momencie byłem w kropce… Wiedziałem o JNI ale bardziej od strony C/C++ i, z mojego punktu, tworzenie DLLki którą się zawrapuje w .NET troszkę było pod górę. Użyłem googli i znalazłem idealne rozwiązanie w obie strony – jni4net.
Potrzebujesz skorzystać z Javy (interfejsów, klas, metod) nic prostszego… Ściągasz, używasz proxygen’a do stworzenia klas typu proxy pomiędzy jvm a clr’em. Kompilujesz je, dorzucasz jako referencje do projektu i pięknie.
Dla mnie aż tak pięknie nie było, bo biblioteka zwracała ArrayList<klasa> i to mnie przez chwilę zabolało, bo w jni4net nie było proxy klasy ArrayList, a generując proxy cały czas dostawałem błędy przy kompilacji. Moim rozwiązaniem było napisanie klasy w javie opakowywującą/serializującą zwrot ArrayList do stringa (xmla). A później jak każdy wie, bez problemu zdeserializujemy w każdym języku 🙂
Program jako „standalone” dziś działał idealnie. Lecz wkompilowanie mojego kodu do wielkiej kobyły skończyło się częstymi wywałkami Javowego modułu. Czemu? Proste, trzeba było ustawić parametry pamięci dla JVMa.
Ale co by nie mówić jni4net dziś uratował mi życie i czas 🙂 BTW: Sprawdziłem w drugą stronę też to działa, czyli użycie .NETowych klas w Javie.
PS. Dla chcących mniej się męczyć jest też JNBridge – płatny!