Как я могу вызвать Foo :: print из Java
так что выход появляется на выходе?
Концептуально говоря, способ заставить Foo :: print (...) записывать в существующий экземпляр Java OutputStream - это написать реализацию C ++ std :: ostream, которая фактически выполняет обратный вызов в Java для вывода.
Это звучит возможно, но я бы не хотел писать / поддерживать код. Во время выполнения вам будут приходить вызовы из Java -> C ++ -> Java, и существует множество возможностей для ошибок, которые могут случайно привести к сбою вашей JVM.
Есть ли способ заставить
OutputStream в std :: ostream в
Слой JNI?
AFAIK №
Могу ли я захватить вывод в буфер
слой JNI, а затем скопировать его в
из
Вы имеете в виду что-то вроде этого?
MyJNIThing m = ...
int myOstream = m.createMemoryBackedOStream(...); // native method
...
m.someMethodWrapper(... myOStream); // native method
...
byte[] data = m.getCapturedData(myOStream); // native method
out.write(data);
Вы, вероятно, можете сделать что-то подобное ... в хороший день при следующем ветре.
Но я думаю, что вы действительно должны стремиться исключить код C ++, а не пытаться делать все более сложные вещи в JNI. IMO, JNI следует использовать только в качестве крайней меры, а не в качестве кратчайшего пути, чтобы избежать перекодирования в Java.