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);
}