Android 2.x以降でFloatBuffer.put()メソッドがhereのように非効率的に実装されているため、FloatBuffer.put()のJni置換メソッドを作成しています。しかし、position()とput()でできるように、src floatの配列をdst floatbufferの指定されたオフセットに配置できるようにしたい。これを念頭において、私はこのJNIメソッドを実装しました。JNIメソッドのヘルプ。 Memcpy with destination offset
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);
}
しかし、何かが間違っているようです。私のゲームエンジンは、私のエンティティを描く必要はありません。誰かが間違った点を見つけることができますか?
おかげ
EDIT:
はちょうどそれは、このコードで動作するようになりました。
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);
}
うれしいことに聞こえます。できるだけ作業コードを回答として掲示してください。 – MByD
クール、私はそれを見て...はいかなりかわいい。 JavaのFloat.SIZE静的変数によると、Sizeは4バイトなので、4バイトにする必要があります。また、sizeof(float)を返すだけで4バイトも返すJNIメソッドを作成しました。 memcpyサイズの引数の上のメソッドをsizeof(float)* numFloatsに変更しました。しかし、その部分に影響はありません。 –
私は "&pDst [dstOffset]"は "pDst + dstOffset"と同等であると思います。 C/C++はポインタ演算を使用します。 – Deucalion