2016-05-03 45 views
2

ショートバージョン: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"に置き換えると、デバイスとエミュレータですべて正常に動作します。

私は間違っていますか?ありがとう!!

答えて

3

ネイティブメソッドの2番目のパラメータがありません:jclass。 Cでのあなたのメソッドのシグネチャは次のようになります。あなたの方法はstaticあるので

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

第二パラメータがjclassです。それがクラスのインスタンスメソッドだった場合、2番目のパラメータはjobject(オブジェクトの場合はthis)になります。メソッドシグネチャの生成に役立つ "javah"ツールの使用を検討することもできます。

+0

ありがとうございます!私はなぜそれがダブルスのために働いたのか分かりませんが、私は本当に2番目のパラメータを欠いていましたが、今はすべてうまくいきます。 – Ian

+0

スタック上で64ビットの引数を64ビットに整列させる必要があるため、double型で動作します。 'classz'引数には32ビットのパディングがあります。 – fadden

+0

あなたは大歓迎です! –

関連する問題