JNI 开发陷阱:C++ Debug 正常为何 Release 返回 NaN
在 Android NDK / JNI 开发中,经常会遇到这样一种'诡异'问题:Debug 模式下运行完全正常,而 Release 模式却出现 NaN、Infinity 甚至随机结果。
本文通过一次真实的 JNI 坐标转换案例,深入分析了该问题的根本原因——C++ 返回局部栈内存指针所导致的未定义行为(Undefined Behavior)。
问题现象描述
现象
-
Debug 构建 JNI 返回的坐标数值正常
-
Release 构建 返回坐标中出现
NaN/Infinity
且仅在 Release 出现
出问题的方法
JNIEXPORT void JNICALL Java_com_eqgis_eqr_core_CoordinateUtilsNative_jni_1ToScenePosition(
JNIEnv *env, jclass clazz,
jdouble ref_x, jdouble ref_y,
jdouble target_location_x, jdouble target_location_y,
jdouble azimuth_rad, jdoubleArray outJNIArray)
{
double* offset = ComputeTranslation(ref_x, ref_y, target_location_x, target_location_y);
double deX = *offset;
double deY = *(offset + 1);
double x = deX * cos(azimuth_rad) - deY * sin(azimuth_rad);
double y = deX * sin(azimuth_rad) + deY * cos(azimuth_rad);
double outArray[] = {x, y};
env->SetDoubleArrayRegion(outJNIArray, 0, 2, outArray);
}
问题根因定位:一个'看起来没问题'的函数
问题最终锁定在这个函数:
double* ComputeTranslation(double x1, double y1, double x2, double y2) {
double res[2] = {, };
res[] = flagX * x;
res[] = flagY * y;
res;
}


