可以說,我有如下原型的函數:JNI,釋放原始的數組和內存不足異常
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;
}
但我m不確定是否可以這樣做,因爲我在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;
}
這是必要的或我能做到這一點的第一種方式?