制作一个 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
。
您链接到的文章的有效性及其非工作代码的基准非常可疑。