Android:将浮点值从Java传递到JNI始终是NaN

时间:2016-05-03 18:28:45

标签: android android-ndk java-native-interface nan

简短版本:我可以使用JNI jdouble将Java中的double值传递给C ++。但是,当我使用浮点数时,C ++ jfloat参数始终为NaN。

更长的版本: 我正在修改VS 2015的hello-gl2 Android示例,它绘制一个三角形(https://code.msdn.microsoft.com/hello-gl2-android-3b61896c),添加一个简单的函数来旋转三角形。

在gl_code.cpp中:

extern "C" {
    JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_updateAngle(JNIEnv * env, jfloat dAngle);
};
JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_updateAngle(JNIEnv * env, jfloat dAngle)
{
    __android_log_print(ANDROID_LOG_DEBUG, "DEBUG", "updateAngle: %f", dAngle);
    rotationAngle += dAngle;
}

在GL2JNILib.java中:

public class GL2JNILib {
    public static native void updateAngle(float dAngle);
}

这一切都来自GL2JNIView.java:

GL2JNILib.updateAngle(0.5f);

VS调试器将jfloat dAngle的值显示为nan(3b52bc),无论我从Java传递什么值,logcat显示“nan”,OpenGL通过不绘制来确认这一点。

我在Nexus 9硬件设备上运行。当使用Nexus_5_API_22_x86模拟器时,我似乎得到许多不同的值,有时是NaN,即使我总是传递0.5f。如果我在上面的所有代码中将“jfloat”替换为“jdouble”并将“float”替换为“double”,那么一切都可以在设备和模拟器上正常工作。

我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:3)

您缺少本机方法中的第二个参数:jclass。 C中的方法签名应为:

JNIEXPORT void JNICALL
    Java_com_android_gl2jni_GL2JNILib_updateAngle(JNIEnv *env,
                                                  jclass classz,
                                                  jfloat dAngle);

第二个参数是jclass,因为您的方法是static。如果它是类的实例方法,那么第二个参数将是jobject(对象的this。)您可以考虑使用“javah”工具来帮助您生成方法签名。 / p>