如何解决这个 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);
第二批线在那里做什么? fid1
和 fid2
是 double 字段的字段 ID,因此 GetDoubleField
是阅读它们的方式。 GetIntField
导致未指定的结果。只删除第二批行。
注意:如果这只是自学 JNI,那就太好了。如果这是因为您认为它会是 'faster',不,它不会,JVM 非常擅长热点此类代码。这很难阅读,而且速度很慢(JNI 桥接绝对不是免费的)。
我正在尝试做 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);
第二批线在那里做什么? fid1
和 fid2
是 double 字段的字段 ID,因此 GetDoubleField
是阅读它们的方式。 GetIntField
导致未指定的结果。只删除第二批行。
注意:如果这只是自学 JNI,那就太好了。如果这是因为您认为它会是 'faster',不,它不会,JVM 非常擅长热点此类代码。这很难阅读,而且速度很慢(JNI 桥接绝对不是免费的)。