2013-05-22 24 views
13

GetStringUTFChars()から返された文字列の末尾にヌル終了文字が含まれていますか?または、私はGetStringUTFLengthを使用して長さを決定する必要がありますか?Javaネイティブコード文字列終了

+2

いつでもチェックできます! – Tdorno

+3

@ Tdorno:ドキュメントを確認してください* http://docs.oracle.com/javase/6/docs/technotes/guides/jni/ spec/functions.html#wp17265 - 元のポスターがしたと思われるもの、そしてそれはある意味では言いません。文字列の終わりにメモリ内にNULLがあるかどうかを調べるだけなので終了するかどうかは、 'GetStringUTFChars'が*常に* r eturn ... –

答えて

17

はい、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プログラマはstrlenGetStringUTFCharsの結果として呼び出すか、直接jstring参照のJNI関数GetStringUTFLengthを呼び出します。

(は以下のように残されていることの証拠を見つけることが、上記の文において、「Unicodeは」「より正確にするJavaによって使用される内部全角文字列表現を「UTF-16」を意味し、またはなお読者のためのエクササイズ)

+0

これが指定されていないと、Java実装が実行するかどうかは、処理が仕様に違反していないためです。 JNI APIの消費者は、文書化されていない動作に依存するかどうか、また安全なC関数を使用するか否かに依存しています。さらに、UTF-8文字列で動作する共通のC関数は、エンコーディング変換関数です。それらの多くは、文字列のサイズをパラメータとして取り、ヌル・ターミネーション・コンセプトにはまったく依存しません。 –

+0

@TomBlodget私はあなたが言っていることを見ていますが、現実的には、Javaランタイムの実装はSunのJNIの実装と互換性がなければなりません。*恐ろしいスペック、「変更されたUTF-8 "とすべて。 IBMは確かに同じように動作します(EBCDICを使用する場合を除いて)。 null終わらないいくつかのJVMに出会った場合に備えて、別の同じ文字列を割り当てることもできますが、他のすべてのJNIもクラッシュするので不要です。 –

+0

"the java native interface pdf"を検索することでpdfを見つけることができます。 Googleブックスでもご利用いただけます。限定数のページをプレビューすることができます(このようなことを確認するのに適しています)。 – D0SBoots

0

はい、GetStringUTFChars()によって返された文字列はNULLで終了します。私は自分のアプリケーションで使っているので、実験的に証明されています。オラクル社の資料は厄介ですが、代替ソースはより有益です。Java Native Interface (JNI) Tutorial

+0

これは、 'GetStringUTFChars'が' print'の 'char'バージョンに適した配列を返すことを前提としている点を除いて、上級チュートリアルです。配列には、1バイト文字ではなくUTF-8コード単位が含まれています。 1バイトあたり1バイトのエンコーディングを取得するには、変換が必要です。あるいは、UnicodeのCコードをコンパイルし、 'wchar_t'関数を直接使用することもできます。 –

+1

"それは私のために働く"ということは、いつも*働いているという証拠ではなく、将来のすべてのJava実装では動作し続けます。 –

+0

@AdamRosenfield、あなたのポイントは何ですか?それでも疑わしい場合は、Oracleに問い合わせるか、JVMのソースコードを参照してください。将来はJVMがないかもしれないので、何ですか? – Archie

関連する問題