Почти все пишут java-агент (с ASM или BCEL), так как им не нужно писать инструментарий байт-кода на C / C ++ с нуля, так как их нет в открытом доступе.
То, что вы не сможете сделать, - это инструмент, профилирование / мониторинг первичной JVM, а для доступа к собственным функциям требуются вызовы JNI. Есть также несколько вызовов JVMTI, которые могут быть недоступны для вас (если память служит).
Я написал свой собственный инструктор на C несколько лет назад, и я нахожусь в процессе написания нового, который, я надеюсь, с открытым исходным кодом (в зависимости от моих злых повелителей :-))
Как насчет половины дома, отдельной предварительно запущенной JVM, в которую ваш собственный агент отправляет байт-код. В этой JVM ваш простой в написании ASM инструктор выполняет тяжелую работу и отправляет полученный байт-код обратно нативному агенту по проводной связи. Да, это кажется немного сложным, но это проще, чем писать собственную библиотеку BCI.