最後から返された文字列はGetStringUTFChars()
null で終了しますか? または、使用して長さを決定し、GetStringUTFLength
自分で null で終了する必要がありますか?
4 に答える
質問に対する現在の回答はすべて古くなっているようです (Edward Thomson の回答の最終更新は 2015 年にさかのぼります)、または Android の世界でのみ信頼できる Android JNI ドキュメントを参照しています。この問題は、最近 (2017 年) の公式の Oracle JNI ドキュメントのクリーンアップと更新で、より具体的にはこの問題で明らかにされています。
現在、JNI仕様には次のように明確に記載されています。
文字列操作
この仕様では、JVM が Java 文字列を内部的に表現する方法については想定していません。これらの操作から返される文字列:
- GetStringChars()
- GetStringUTFChars()
- GetStringRegion()
- GetStringUTFRegion()
- GetStringCritical()
したがって、NULL で終了する必要はありません。プログラマーは、GetStringLength() または GetStringUTFLength() を介してバッファー容量の要件を決定する必要があります。
一般的なケースでは、これは、UTF-8 文字列であっても、JNI が返す文字列が null で終了していると想定してはならないことを意味します。実用的な世界では、サポートされている JVM のリストで特定の動作をテストできます。私の経験では、実際にテストした JVM を参照すると、次のようになります。
\u0000
Oracle JVM は、UTF-16 文字列 ( を使用) と UTF-8 文字列 ( を使用)の両方を null で終了します'\0'
。- Android JVM は UTF-8 文字列を終了しますが、UTF-16 文字列は終了しません。
はい、GetStringUTFChars() によって返される文字列は null で終了します。私は自分のアプリケーションでそれを使用しているので、実験的に証明しました。Oracle のドキュメントはひどいものですが、代替ソースはより有益です: Java Native Interface (JNI) チュートリアル