当前位置: 首页 > 知识库问答 >
问题:

如何修复此NaN

隆功
2023-03-14

我试图做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());
                
        }

    }            
#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;
    
    
}

如何修复输出NaN

共有1个答案

狄灵均
2023-03-14
weight1 = (*env)->GetDoubleField(env,obj,fid1);
height1 = (*env)->GetDoubleField(env,obj,fid2);

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

第二批线路在那里做什么?fid1fid2是双字段的字段ID,因此应该如何读取它们。GetIntField生成未指定的结果。只需删除第二批行。

注意:如果这只是自学JNI,干得好。如果这是因为您认为它会“更快”,不,不会的,JVM在热点发现这类代码方面非常出色。这只是很难阅读,而且速度慢得多(JNI桥接绝对不是免费的)。

 类似资料:
  • 我正在编程一个需要Hibernate技术的项目。我得到了堆栈痕迹,但我不知道如何修复它。有什么需要帮忙的吗? 这是我的堆栈跟踪,我得到了这两个错误: SLF4J:slf4j-api 1.6.x(或更高版本)与此绑定不兼容。SLF4J:您的绑定是1.5.5或更早版本。SLF4J:将绑定升级到1.6.x版本。或2.0.x 导入org.hibernate.hibernateException;导入org

  • 问题内容: 我想我正在解决这个问题,但是遇到了另一个障碍,并且不知道如何解决它 此查询有什么问题- 只需获取通用的“您有一个错误”,它指向联接,但我不知道如何解决它。我想要对customer_address_entity进行联接,因为它具有我需要在其中一条select语句中使用的另一个唯一ID。 问题答案: 首先,您的代码如下所示: 很明显,您在FROM之前有JOIN。 其次,您有一个带有unic

  • 我开始了一个新的项目,并把火基地云: 这个错误出现了: 警告:API的变体。getJavaCompile()已过时,已替换为“variant”。getJavaCompileProvider()。它将于2019年底拆除。有关详细信息,请参阅https://d.android.com/r/tools/task-configuration-avoidance.确定什么是调用变量。getJavaCompi

  • 我发现了一个mysql创建表语法错误,希望有人能在我失去理智之前发现它。 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解在第2行“int not null auto_increment,Client_ID int not null,Start_Time varchar(5),star”附近使用的正确语法 mysql Ver 14.14

  • 当我想将数据从数据库导出到excel文件时,我得到以下异常“java.lang.IllegalStateException:getOutputStream()已经被调用用于此响应”。 /****服务****/ /*错误*/