JNI 方法帮助.具有目的地偏移的内存


我正在为 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);
}

让它使用此代码。

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);
}
memcpy( pDst + (dstOffset << 2), pSrc, numFloats << 2 );

第一个<< 2不正确。删除它。C 编译器将根据 *pDst 的大小自动调整增量。

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

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

最新更新