Как я могу вызвать Foo::print из Java, чтобы вывод отображался на выходе?
Концептуально говоря, способ заставить Foo::print(...) писать в существующий экземпляр Java OutputStream состоит в том, чтобы написать реализацию C++ std::ostream, которая фактически выполняет обратный вызов в Java для выполнения вывода.
Это звучит возможно, но я бы не хотел писать/поддерживать код. Во время выполнения у вас будут вызовы, идущие из Java -> C++ -> Java, и есть много возможностей для совершения ошибок, которые случайно приведут к сбою вашей JVM.
Есть ли способ принудить OutputStream к std::ostream на уровне JNI?
АФАИК нет.
Могу ли я захватить выходные данные в буфер слоя 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.
person
Stephen C
schedule
16.09.2009