からFoo :: printを呼び出して、出力が表示されるようにするにはどうすればよいですか?
概念的には、話して、既存のJavaのOutputStreamインスタンスへの書き込みにはFoo ::プリント(...)を取得する方法は、実際に出力を行うためにJavaへのコールバックを行うC++のstd :: ostreamに実装を書くことです。
それは可能ですが、私はコードを書いたり維持したりしたくありません。実行時にはJava - > C++ - > Javaからの呼び出しがあり、JVMがランダムにクラッシュする間違いを犯す機会がたくさんあります。
STDへ OutputStreamを強制する方法はあります:: JNI層中のostream?
AFAIK no。
は、私は、バッファ 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でのコードの再作成を避けるための短期間ではありません。
Javaでのライブラリの再実装はオプションではありません(大規模で成熟し、パフォーマンスが向上します)。 –
おそらく、あなたはJavaからそれを呼び出すべきではないでしょう。私の主張は、あなた自身とあなたのコードを維持しなければならない人々のために多くの痛みを引き起こす可能性が高いということです。 –
私はJNIコードには間違いを避けるべきだと言うのは難しいと同意しているが、それは公正ではない。間違いなく、JNIのための場所は、特にopのような大規模なレガシープロジェクトと私の場合は、仕事を完了するために使用する必要がありますサードパーティ製のAPIです。これは非常に有効な質問です。私も同様の答えを探しています。 – Cliff