1

我正在为 FloatBuffer.put() 制作 Jni 替换方法,因为在 Android 2.x 及更低版本上,FloatBuffer.put() 方法的实现效率低下,如此所述。但是,我希望能够将给定的 src 浮点数组放置到 dst 浮点缓冲区中的指定偏移量,就像使用 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);
}
4

2 回答 2

1

让它与这个代码一起工作。

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);
}
于 2012-05-01T06:58:51.613 回答
0
memcpy( pDst + (dstOffset << 2), pSrc, numFloats << 2 );

第一个<< 2是不正确的。去掉它。C 编译器将根据 sizeof *pDst 自动调整增量。

编辑:第二班应该是* sizeof float.

您链接到的文章的有效性及其非工作代码的基准非常可疑。

于 2012-05-02T09:41:42.430 回答