GetStringUTFChars()
から返された文字列の末尾にヌル終了文字が含まれていますか?または、私はGetStringUTFLength
を使用して長さを決定する必要がありますか?Javaネイティブコード文字列終了
答えて
はい、GetStringUTFChars
はヌルで終了する文字列を返します。しかし、私はあなたが私の言葉を取るべきではないと思っています。代わりに、この質問に答える権威のあるオンラインソースを見つけるべきです。
のは、それが言う実際Java Native Interface Specification自体、始めましょう:
は修正UTF-8エンコーディングの文字列を表すバイトの配列へのポインタを返します。この配列は、
ReleaseStringUTFChars()
によって解放されるまで有効です。
ああ、驚くべきことに、それがヌル終了しているかどうかはわかりません。これは巨大な監視のようだが、幸いなことに誰かがこのバグを2008年にSun's Java bug databaseに記録するのに十分なほど親切だった。a similar but different documentation bug(読者が読んだことを示唆) 、 "The Java Native Interface: Programmer's Guide and Specification"があり、これがJNIの新しい仕様になるという提案があります。
しかし、私たちは正式なオンラインソースを探していますが、これは正式なものではありません(まだの仕様ではありません)。
幸いなことに、特定の人気のあるオンライン書籍小売業者の書籍のレビューでは、この書籍はオンラインから無料でオンラインで入手でき、少なくともオンライン部分を満たすことができます。 SunのJNI web pageには魅力的に近いリンクがありますが、そのリンクは悲しいことではないと言います。
それがいることをあなたに説明しますどこだから私は、(それは実際には良い本です)私は、このための信頼できるオンラインソースにあなたを指すことはできません、あなたが本を購入する必要があります怖い:
UTF-8文字列は、常に
'\0'
文字で終了しますが、Unicode文字列は終了しません。jstring
をUTF-8形式で表すために必要なバイト数を調べるには、JNIプログラマはstrlen
をGetStringUTFChars
の結果として呼び出すか、直接jstring
参照のJNI関数GetStringUTFLength
を呼び出します。
(は以下のように残されていることの証拠を見つけることが、上記の文において、「Unicodeは」「より正確にするJavaによって使用される内部全角文字列表現を「UTF-16」を意味し、またはなお読者のためのエクササイズ)
これが指定されていないと、Java実装が実行するかどうかは、処理が仕様に違反していないためです。 JNI APIの消費者は、文書化されていない動作に依存するかどうか、また安全なC関数を使用するか否かに依存しています。さらに、UTF-8文字列で動作する共通のC関数は、エンコーディング変換関数です。それらの多くは、文字列のサイズをパラメータとして取り、ヌル・ターミネーション・コンセプトにはまったく依存しません。 –
@TomBlodget私はあなたが言っていることを見ていますが、現実的には、Javaランタイムの実装はSunのJNIの実装と互換性がなければなりません。*恐ろしいスペック、「変更されたUTF-8 "とすべて。 IBMは確かに同じように動作します(EBCDICを使用する場合を除いて)。 null終わらないいくつかのJVMに出会った場合に備えて、別の同じ文字列を割り当てることもできますが、他のすべてのJNIもクラッシュするので不要です。 –
"the java native interface pdf"を検索することでpdfを見つけることができます。 Googleブックスでもご利用いただけます。限定数のページをプレビューすることができます(このようなことを確認するのに適しています)。 – D0SBoots
はい、GetStringUTFChars()によって返された文字列はNULLで終了します。私は自分のアプリケーションで使っているので、実験的に証明されています。オラクル社の資料は厄介ですが、代替ソースはより有益です。Java Native Interface (JNI) Tutorial
これは、 'GetStringUTFChars'が' print'の 'char'バージョンに適した配列を返すことを前提としている点を除いて、上級チュートリアルです。配列には、1バイト文字ではなくUTF-8コード単位が含まれています。 1バイトあたり1バイトのエンコーディングを取得するには、変換が必要です。あるいは、UnicodeのCコードをコンパイルし、 'wchar_t'関数を直接使用することもできます。 –
"それは私のために働く"ということは、いつも*働いているという証拠ではなく、将来のすべてのJava実装では動作し続けます。 –
@AdamRosenfield、あなたのポイントは何ですか?それでも疑わしい場合は、Oracleに問い合わせるか、JVMのソースコードを参照してください。将来はJVMがないかもしれないので、何ですか? – Archie
- 1. Newtonsoft.Json.JsonReaderException:未終了文字列です。
- 2. 未終了の文字列リテラルエラー
- 3. のstd ::文字列:: c_str&ヌル終了
- 4. 終了文字列定数スクリプトエラー
- 5. Perl NULLで終了する文字列
- 6. PythonのURL終了文字列カウンタ
- 7. パイソンプリント(「文字列」、終了=「」)空の出力
- 8. 非ヌル終了C文字列を終了C文字列に変換する最もきれいな方法
- 9. ヌルで終了する2文字の文字列
- 10. 開始文字と終了文字の一致する文字列
- 11. 文字列内のC文字列ポインタがNULLで終了する方法は?
- 12. 終了と文字列を文字列のリストに分割する
- 13. MVC3終了文字列定数構文エラー
- 14. 特殊文字で終わる分割文字列 - Java
- 15. 文字列プロパティ(SWIG、Java)の設定時にJREが終了しました
- 16. null文字列の配列を終了します
- 17. ユニコード文字で終了したjava-readファイル
- 18. null終了文字列とx86アセンブリ言語でヌルで終わらない文字列との違い
- 19. Java;文章で終了したコード
- 20. 文字列に中/開始/終了アラビア文字を入力します。
- 21. 文字列をループして特定の文字で終了する新しい文字列を返す方法
- 22. 文字列の正規表現の開始/文字列メタ文字の終了のニーモニックチップ
- 23. テキストの文字を終了する
- 24. vimscriptの終了文字をスキップする
- 25. Crystal Reportsの終了しない文字列定数
- 26. 文字列の開始と終了の検索方法
- 27. SyntaxError:終了文字列リテラルエラー奇妙なエラー
- 28. DllImport nullで終了した文字列を返すAccessViolationException
- 29. 終了文字列の末尾に来るとwhileループ
- 30. 開始と終了が同じ部分文字列
いつでもチェックできます! – Tdorno
@ Tdorno:ドキュメントを確認してください* http://docs.oracle.com/javase/6/docs/technotes/guides/jni/ spec/functions.html#wp17265 - 元のポスターがしたと思われるもの、そしてそれはある意味では言いません。文字列の終わりにメモリ内にNULLがあるかどうかを調べるだけなので終了するかどうかは、 'GetStringUTFChars'が*常に* r eturn ... –