2011-12-12 30 views
1

私は現在、JNIを大量に使う私のプロジェクトに取り組んでいます.JNIは私には全く新しいものです...私はそれについて多くのことを読んでいます。一つの問題があります。一つのネイティブ関数で、オペレーションの状態である整数で、GetStringUTFChars()を使用して文字列を割り当てることができない場合は、特定のエラーコードを返します。JNI:GetStringUTFChars()は失敗した場合にOOMをスローしますか?

しかし、私は反対しているように見える2つのドキュメンテーションがあります。

私は2番目のドキュメントは新しいものだと考える傾向があります。私は間違っていますか?

答えて

0
も、てulimitで遊んとネイティブ失敗をトリガーするように取得するには後に、私が原因GetStringUTFCharsのためのmalloc()()にできることではないにJVMのクラッシュを持って、OK

:/

私は「推測失敗すればNULLを返すと仮定していますが、これが起こることは非常に疑いがあります.JVMは確かにクラッシュするでしょう。

2

私はドキュメントの2つのセットが同意すると思う(少なくとも私が今見ているバージョン)。 http://java.sun.com/docs/books/jni/html/objtypes.htmlから

はGetStringUTFCharsの戻り値をチェックすることを忘れないでください。 Java仮想マシンの実装では、UTF-8文字列を保持するためにメモリを割り当てる必要があるため、メモリ割り当てが失敗する可能性があります。その場合、GetStringUTFCharsはNULLを返し、OutOfMemoryError例外をスローします。第6章で学ぶように、JNIで例外をスローすることは、Javaプログラミング言語で例外をスローすることとは異なります。 JNIから投げられた保留中の例外は、ネイティブCコードの制御フローを自動的に変更しません。代わりに、C関数の残りのステートメントをスキップするために、明示的なreturnステートメントを発行する必要があります。 Java_Prompt_getLineが返った後、Prompt.getLineネイティブメソッドの呼び出し元であるPrompt.mainに例外がスローされます。 http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.htmlから

RETURNS:

操作が失敗した場合、修正UTF-8文字列、またはNULLへのポインタを返します。

NULLが失敗した場合に返されますが、最初は、さらに進んで、JNI C++関数が戻ると、例外がJavaの層の中にスローされると述べているように、両方の状態。

関連する問題