1

FloatBuffer.put() の Jni 代替メソッドを作成しています。これは、Android 2.x 以下では、ここに記載されているように FloatBuffer.put() メソッドが非効率的に実装されているためです。ただし、position() と put() を使用してできるように、特定の src float の配列を dst floatbuffer の指定されたオフセットに配置できるようにしたいと考えています。これを念頭に置いて、この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 に基づいてインクリメントを自動的に調整します。

編集: 2 番目のシフトは* sizeof float.

リンク先の記事の有効性と、動作しないコードのベンチマークはかなり疑わしいものです。

于 2012-05-02T09:41:42.430 に答える