我正在为FloatBuffer.put()创建一个Jni替换方法,因为在Android 2.x及更低版本中,FloatBuffer.put()方法按照所述here的效率低效实现。但是,我希望能够将给定的src浮点数放到dst floatbuffer中的指定偏移量,就像我可以使用position()和put()。考虑到这一点,我实现了这个JNI方法。
JNIEXPORT void JNICALL Java_com_voidseer_voidengine_mesh_Vertices_PutFloatsJni
(JNIEnv *env, jclass, jfloatArray src, jobject dst, jint numFloats, jint dstOffset )
{
float* pDst = (float*)env->GetDirectBufferAddress( dst );
float* pSrc = (float*)env->GetPrimitiveArrayCritical(src, 0);
memcpy( pDst + (dstOffset << 2), pSrc, numFloats << 2 );
env->ReleasePrimitiveArrayCritical(src, pSrc, 0);
}
然而,似乎有些不对劲。我的游戏引擎不会像我们应该那样绘制我的实体。有人发现我在这个函数中做错了吗?
由于
编辑:
刚刚使用此代码。
JNIEXPORT void JNICALL Java_com_voidseer_voidengine_mesh_Vertices_PutFloatsJni
(JNIEnv *env, jclass, jfloatArray src, jobject dst, jint numFloats, jint dstOffset )
{
float* pDst = (float*)env->GetDirectBufferAddress( dst );
float* pSrc = (float*)env->GetPrimitiveArrayCritical(src, 0);
memcpy( &pDst[dstOffset], pSrc, numFloats << 2 );
env->ReleasePrimitiveArrayCritical(src, pSrc, 0);
}
答案 0 :(得分:0)
使用此代码。
JNIEXPORT void JNICALL Java_com_voidseer_voidengine_mesh_Vertices_PutFloatsJni
(JNIEnv *env, jclass, jfloatArray src, jobject dst, jint numFloats, jint dstOffset )
{
float* pDst = (float*)env->GetDirectBufferAddress( dst );
float* pSrc = (float*)env->GetPrimitiveArrayCritical(src, 0);
//memcpy( pDst + (dstOffset << 2), pSrc, numFloats << 2 );
memcpy( &pDst[dstOffset], pSrc, sizeof(float) * numFloats );
env->ReleasePrimitiveArrayCritical(src, pSrc, 0);
}
答案 1 :(得分:0)
memcpy( pDst + (dstOffset << 2), pSrc, numFloats << 2 );
第一个<< 2
不正确。去掉它。 C编译器将根据sizeof * pDst自动调整增量。
编辑:第二班应该是* sizeof float
。
您链接的文章的有效性及其非工作代码的基准非常可疑。