如何解决这个 NaN

How to fix this NaN

我正在尝试做 Java 使用 gcc 编译 c 文件的本机接口 java 代码是

import java.util.Scanner;

class BMICalculator {

double weight, height;
native double BMIcalculate();

static {
    System.loadLibrary("Calculate");
}
public static void main(String args[]){
                      
            Scanner input = new Scanner(System.in);
            BMICalculator total = new BMICalculator();
                
            System.out.printf("Enter your weight : ");
            total.weight = input.nextDouble();
            System.out.printf("Enter your height : ");
            total.height = input.nextDouble();

            System.out.println("Your BMI is " + total.BMIcalculate());
                
        }

    }            

.c 文件是:

#include <jni.h>
#include <math.h>


JNIEXPORT jdouble JNICALL Java_BMICalculator_BMIcalculate(JNIEnv *env, jobject obj){
    
    jdouble total, weight1, height1 ;
    jfieldID fid1, fid2;
        
    jclass cls = (*env)->GetObjectClass(env,obj);
    fid1 = (*env)->GetFieldID(env,cls,"weight","D");
    fid2 = (*env)->GetFieldID(env,cls,"height","D");
    
    if((fid1 == NULL) || (fid2 == NULL)) return 0;
    
    
    weight1 = (*env)->GetDoubleField(env,obj,fid1);
    height1 = (*env)->GetDoubleField(env,obj,fid2);

    weight1 = (*env)->GetIntField(env,obj,fid1);
    height1 = (*env)->GetIntField(env,obj,fid2);
    
    
    
    height1 = height1 / 100;
    
    total = weight1 / ( height1 * height1 );    

        return total;
    
    
}

我不确定是 .c 文件中的函数有问题还是我的 java 代码,因为我得到的输出是

如何修复输出 NaN

weight1 = (*env)->GetDoubleField(env,obj,fid1);
height1 = (*env)->GetDoubleField(env,obj,fid2);

weight1 = (*env)->GetIntField(env,obj,fid1);
height1 = (*env)->GetIntField(env,obj,fid2);

第二批线在那里做什么? fid1fid2double 字段的字段 ID,因此 GetDoubleField 是阅读它们的方式。 GetIntField 导致未指定的结果。只删除第二批行。

注意:如果这只是自学 JNI,那就太好了。如果这是因为您认为它会是 'faster',不,它不会,JVM 非常擅长热点此类代码。这很难阅读,而且速度很慢(JNI 桥接绝对不是免费的)。