ショートバージョン:JNI jdoubleを使用してJavaからC++へのdouble値を渡すことができます。しかし、浮動小数点数を使用する場合、C++のjfloatパラメータは常にNaNです。Android:JavaからJNIへのfloat値の受け渡しは常にNaNです
長いバージョン: 三角形(https://code.msdn.microsoft.com/hello-gl2-android-3b61896c)を描くVS 2015のhello-gl2 Androidサンプルを修正して、三角形を回転する簡単な関数を追加しました。
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デバッガgl_code.cppで
jfloat dAngleの値がJava(3b52bc)であることを示しています。Javaから渡された値に関係なく、logcatは "nan"とOpenGL co何も描かずにこれを否定します。
私はNexus 9ハードウェアデバイスで動作しています。 Nexus_5_API_22_x86エミュレータを使用する場合、私は常に0.5fを渡していますが、多くの異なる値を取得するように見えます。上記のすべてのコードで "jfloat"を "jdouble"と "float"を "double"に置き換えると、デバイスとエミュレータですべて正常に動作します。
私は間違っていますか?ありがとう!!
ありがとうございます!私はなぜそれがダブルスのために働いたのか分かりませんが、私は本当に2番目のパラメータを欠いていましたが、今はすべてうまくいきます。 – Ian
スタック上で64ビットの引数を64ビットに整列させる必要があるため、double型で動作します。 'classz'引数には32ビットのパディングがあります。 – fadden
あなたは大歓迎です! –