JNI 开发:为什么 C++ 在 Debug 正常,Release 却返回 NaN?
本文记录了一次典型的 JNI 坐标转换案例中出现的诡异问题。
一、问题现象描述
1. 现象
- Debug 构建:JNI 返回的坐标数值正常。
- Release 构建:返回坐标中出现
NaN/Infinity,且仅在 Release 模式出现。
2. 出问题的方法
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 x2) {
double res[2] = {0, 0};
// ... 计算逻辑 ...
res[] = flagX * x;
res[] = flagY * y;
res;
}


