1

一部の JNI コードではGetStringCritical()、文字列の内容を取得するために を呼び出します。その直後に、ExceptionCheck()発生した例外を処理するために呼び出します。

でコードを実行していますが-Xcheck:jni、大量の...

Warning: Calling other JNI functions in the scope of Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical

...これはへの呼び出しによって引き起こされていますExceptionCheck()(コードのステップ実行によって決定されます)。

GetStringCritical()このことから、例外が発生しないと仮定して正しいでしょうか?

4

2 に答える 2

2

関数に関する実際の情報を実際に含む複数のトピックのドキュメントをたどるとGetStringCritical、次のことがわかります。

重要な領域内では、ネイティブ コードは他の JNI 関数を呼び出してはなりません

Unicode 文字列へのポインターを返します。操作が失敗した場合は NULL を返します。

いいえ、例外は発生せず、警告はドキュメントと一致しています: don't call other JNI functions.

を呼び出すGetStringCriticalと、文字列内の文字に短期間アクセスできるため、C関数でそれらを使用またはコピーできます。

于 2013-04-29T22:56:44.200 に答える
0

私は同じ問題を抱えていました。主な理由は、getstringprimitive/getprimitivearray を使用した後、releaseprimitive を呼び出す必要があるためです。そうでない場合、同じJavaオブジェクトで複数の呼び出しがある場合、1つのオブジェクトのセッションをすでに開いており、別の関数呼び出し内でそれを使用しようとしていることがわかります。

例えば:

Func1(..){
env->GetStringCritical(..)
env->ReleaseStringCritical(..)
}

Func2(..){
env->GetStringCritical(..)
}

それらの1つを解放しないと、その警告が表示されます。Func2 にもリリースを入れるだけで、その問題は解消されます。

于 2014-09-10T12:18:04.003 に答える