Допустим, у меня есть функция со следующим прототипом:
JNIEXPORT void JNICALL Java_example_SCLASS_cfunc
(JNIEnv *env, jclass caller, jdoubleArray s, jdoubleArray u, jdoubleArray vt)
Я хочу сделать что-то вроде этого:
{
jdouble* S_native = (*env)->GetDoubleArrayElements(env, s, JNI_FALSE);
jdouble* U_native = (*env)->GetDoubleArrayElements(env, u, JNI_FALSE);
jdouble* VT_native = (*env)->GetDoubleArrayElements(env, vt, JNI_FALSE);
if(!S_native || !U_native || !VT_native){
(*env)->ReleaseDoubleArrayElements(env, s, S_native, 0);
(*env)->ReleaseDoubleArrayElements(env, u, U_native, 0);
(*env)->ReleaseDoubleArrayElements(env, vt, VT_native, 0);
return;
}
/*Now Use the arrays in some way...*/
(*env)->ReleaseDoubleArrayElements(env, s, S_native, 0);
(*env)->ReleaseDoubleArrayElements(env, u, U_native, 0);
(*env)->ReleaseDoubleArrayElements(env, vt, VT_native, 0);
return;
}
Но я не уверен, что смогу это сделать, потому что я прочитал в документации jni, что
Вы должны вернуться, как только сгенерировано Java-исключение,
т.е. (* env) -> GetDoubleArray ... завершается неудачей.
Так что я не уверен, что произойдет, если вы сделаете еще один вызов GetDoubleArray после того, как предыдущий сбой.
Так что, несмотря на неопределенность, мой код отформатирован следующим образом:
{
jdouble* S_native;
jdouble* U_native;
jdouble* VT_native;
S_native = (*env)->GetDoubleArrayElements(env, s, JNI_FALSE);
if(!S_native){
return;
}
U_native = (*env)->GetDoubleArrayElements(env, u, JNI_FALSE);
if(!U_native){
(*env)->ReleaseDoubleArrayElements(env, s, S_native, 0);
return;
}
VT_native = (*env)->GetDoubleArrayElements(env, vt, JNI_FALSE);
if(!VT_native){
(*env)->ReleaseDoubleArrayElements(env, s, S_native, 0);
(*env)->ReleaseDoubleArrayElements(env, u, U_native, 0);
return;
}
/*Now Use the arrays in some way...*/
(*env)->ReleaseDoubleArrayElements(env, s, S_native, 0);
(*env)->ReleaseDoubleArrayElements(env, u, U_native, 0);
(*env)->ReleaseDoubleArrayElements(env, vt, VT_native, 0);
return;
}
Это необходимо или я могу сделать это первым способом?