JavaからFoo::printを呼び出して、出力が出力に表示されるようにするにはどうすればよいですか?
概念的には、Foo :: print(...)を既存のJava OutputStreamインスタンスに書き込む方法は、出力を行うために実際にJavaへのコールバックを行うC ++ std::ostream実装を作成することです。
それは可能に聞こえますが、私はコードを書いたり維持したりしたくありません。実行時に、Java-> C ++-> Javaからの呼び出しがあり、JVMをランダムにクラッシュさせるミスを犯す機会がたくさんあります。
OutputStreamをJNIレイヤーのstd::ostreamに強制変換する方法はありますか?
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);
あなたはおそらくそのような仕事をすることができます...次の風で良い日に。
しかし、JNI全体でますます複雑になることをやろうとするのではなく、C++コードを排除することを本当に目指すべきだと思います。IMO、JNIは最後の手段としてのみ使用する必要があり、Javaでの再コーディングを回避するためのショートカットではありません。