Android:将浮点值从 Java 传递到 JNI 始终为 NaN
Android: Passing float values from Java to JNI is always NaN
简短版本:我可以使用 JNI jdouble 将双精度值从 Java 传递到 C++。但是,当我使用浮点数时,C++ jfloat 参数始终为 NaN。
更长的版本:
我正在修改绘制三角形 (https://code.msdn.microsoft.com/hello-gl2-android-3b61896c) 的 VS 2015 的 hello-gl2 Android 示例,添加一个简单的函数来旋转三角形。
在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);
无论我从 Java 传递什么值,VS 调试器都显示 jfloat dAngle 的值为 nan(3b52bc),logcat 显示 "nan" 并且 OpenGL 通过绘图确认了这一点没什么。
我 运行 在 Nexus 9 硬件设备上。使用 Nexus_5_API_22_x86 模拟器时,我似乎得到了许多不同的值,有时是 NaN,尽管我总是传入 0.5f。如果我在上面的所有代码中将 "jfloat" 替换为 "jdouble" 并将 "float" 替换为 "double",则在设备和模拟器上一切正常。
我做错了什么?谢谢!!
您缺少本机方法中的第二个参数:jclass
。你在 C 中的方法签名应该是:
JNIEXPORT void JNICALL
Java_com_android_gl2jni_GL2JNILib_updateAngle(JNIEnv *env,
jclass classz,
jfloat dAngle);
第二个参数是jclass
因为你的方法是static
。如果它是 class 的实例方法,那么第二个参数将是 jobject
(对象的 this
。)您可以考虑使用 "javah" 工具来帮助您生成方法签名。
简短版本:我可以使用 JNI jdouble 将双精度值从 Java 传递到 C++。但是,当我使用浮点数时,C++ jfloat 参数始终为 NaN。
更长的版本: 我正在修改绘制三角形 (https://code.msdn.microsoft.com/hello-gl2-android-3b61896c) 的 VS 2015 的 hello-gl2 Android 示例,添加一个简单的函数来旋转三角形。
在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);
无论我从 Java 传递什么值,VS 调试器都显示 jfloat dAngle 的值为 nan(3b52bc),logcat 显示 "nan" 并且 OpenGL 通过绘图确认了这一点没什么。
我 运行 在 Nexus 9 硬件设备上。使用 Nexus_5_API_22_x86 模拟器时,我似乎得到了许多不同的值,有时是 NaN,尽管我总是传入 0.5f。如果我在上面的所有代码中将 "jfloat" 替换为 "jdouble" 并将 "float" 替换为 "double",则在设备和模拟器上一切正常。
我做错了什么?谢谢!!
您缺少本机方法中的第二个参数:jclass
。你在 C 中的方法签名应该是:
JNIEXPORT void JNICALL
Java_com_android_gl2jni_GL2JNILib_updateAngle(JNIEnv *env,
jclass classz,
jfloat dAngle);
第二个参数是jclass
因为你的方法是static
。如果它是 class 的实例方法,那么第二个参数将是 jobject
(对象的 this
。)您可以考虑使用 "javah" 工具来帮助您生成方法签名。