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. 未終了の文字列リテラルエラー
- 2. Perl NULLで終了する文字列
- 3. Newtonsoft.Json.JsonReaderException:未終了文字列です。
- 4. 終了文字列定数スクリプトエラー
- 5. 非ヌル終了C文字列を終了C文字列に変換する最もきれいな方法
- 6. ヌルで終了する2文字の文字列
- 7. MVC3終了文字列定数構文エラー
- 8. 文字列の正規表現の開始/文字列メタ文字の終了のニーモニックチップ
- 9. 正規表現知ら開始と終了の文字列
- 10. Crystal Reportsの終了しない文字列定数
- 11. 私は文字列リテラルエラーを終了しません
- 12. nullで終了しない文字列のstrlen()?
- 13. 文字列の開始と終了の検索方法
- 14. Androidの部分文字列の強制終了
- 15. C++、boost asio、ヌル終了文字列を受け取ります。
- 16. DllImport nullで終了した文字列を返すAccessViolationException
- 17. 終了する文字列を解析する
- 18. 文字列型(価値の「重力」で「終了」)
- 19. SyntaxError:終了文字列リテラルエラー奇妙なエラー
- 20. 文字列終了 - char c = 0 vs char c = '\ 0'
- 21. char配列をCの終了文字で
- 22. テキストの文字を終了する
- 23. 終端文字列リテラル
- 24. Javaの文字列と文字配列
- 25. Javaの:文字列:文字列
- 26. ListViewで文字列配列を設定すると強制終了します
- 27. Swiftの文字列の開始と終了の文字列を検索し置換する正規表現
- 28. Java - エンコーディング文字列
- 29. のJava - 文字列
- 30. フォーマット文字列java
いつでもチェックできます! – Tdorno
@ Tdorno:ドキュメントを確認してください* http://docs.oracle.com/javase/6/docs/technotes/guides/jni/ spec/functions.html#wp17265 - 元のポスターがしたと思われるもの、そしてそれはある意味では言いません。文字列の終わりにメモリ内にNULLがあるかどうかを調べるだけなので終了するかどうかは、 'GetStringUTFChars'が*常に* r eturn ... –