JNI方法帮助。 Memcpy与目的地偏移

时间:2012-04-30 22:57:33

标签: java android java-native-interface buffer native

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

2 个答案:

答案 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

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