Я работал с приложением, которое первоначально пыталось JNI взаимодействовать с собственным кодом для доступа к COM, и в итоге его было очень очень сложно поддерживать и отлаживать. (К счастью, я не был человеком, работающим над этой частью приложения!) В результате этого опыта я теперь рекомендую, чтобы код Java, необходимый для доступа к COM, сделал это, написав приложение на C # для доступа к COM, и использовал зазубренная розетка между двумя приложениями.
JNI излишне рискован и сложен в Java по сравнению с аналогом в C #, поэтому наиболее стабильный способ сделать это из Java - это не делать это из Java. Делегируйте доступ COM к чему-то, что имеет опыт в доступе COM: C #.
Ваша другая альтернатива - лицензировать какую-либо стороннюю библиотеку, которая сама управляет JNI для вас. Но если вам не нравится боль, я настоятельно рекомендую вам не использовать собственное решение JNI.
Добавлено позже: как видно из ссылки, на которую вы ссылались, код JNI может привести к сбою всей JVM. По крайней мере, если доступ к COM находится на другом конце сокета, если приложение C # падает, вы теряете свой сокет, который вы можете легко восстановить, когда приложение C # вернется. Тем не менее, C # far менее вероятен сбой при доступе к COM. Да, лучше иметь 100% чистое Java-решение, но иногда гораздо лучше делегировать задачи на другой язык.