2016-05-03 102 views
2

簡短版本:我可以使用JNI jdouble將Java中的double值傳遞給C++。但是,當我使用浮動時,C++ jfloat參數始終是NaN。Android:將float值從Java傳遞給JNI始終是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 co通過畫什麼來證明這一點。

我在Nexus 9硬件設備上運行。當使用Nexus_5_API_22_x86模擬器時,我似乎得到了許多不同的值,有時甚至是NaN,即使我總是以0.5f傳遞。如果我在上面的所有代碼中將「jdlo」和「float」替換爲「double」,那麼在設備和仿真器上一切正常。

我在做什麼錯?謝謝!!

回答

3

您在本機方法中缺少第二個參數:jclass。在C本方法的簽名應該是:

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

的第二個參數是一個jclass因爲你的方法是static。如果它是該類的實例方法,那麼第二個參數將是jobject(該對象的this)。您可能會考慮使用「javah」工具來幫助您生成方法簽名。

+0

非常感謝!我不知道爲什麼它爲雙打工作,但我確實錯過了第二個參數,現在一切都很好。 – Ian

+0

它適用於雙打,因爲64位參數必須在堆棧上對齊64位。 'classz'參數獲得了32位填充。 – fadden

+0

非常歡迎您! –

相關問題