NDK,使用FloatBuffer作为参数

时间:2015-12-09 00:37:41

标签: java android android-ndk java-native-interface nio

我正在使用NDK和本机缓冲区。我有以下代码:

使用本机方法的Java类定义:

public class MyNDK {

    static {
        System.loadLibrary("MyLibrary");
    }

    public native void workWithFloatBuffer(FloatBuffer buffer, int base, int size);

}

本机代码实现(我测试了它的定义,没关系):

JNIEXPORT void JNICALL Java_com_example_xcesco_myapplication_MyNDK_workWithFloatBuffer(JNIEnv *env, jobject object, jobject input, jint base, jint size)
{
    jfloat *buffer =(jfloat *) env->GetDirectBufferAddress(input);

    for (int i=base;i<size;i++)
    {
        buffer[i]=i*2.0f;
    }
}

用于测试结果的活动中的代码:

    FloatBuffer buffer= ByteBuffer.allocateDirect(4*10).asFloatBuffer();
    (new MyNDK()).workWithFloatBuffer(buffer, 0,4);

    for (int i=0; i< 4;i++) {
        Log.i("BLA", "value["+i+"]="+buffer.get(i));
    }

日志的当前结果是:

value[0]=0.0
value[1]=9.0E-44
value[2]=4.6007E-41
value[3]=6.8966E-41

这与

的预期结果非常不同
value[0]=0.0
value[1]=2
value[2]=4
value[3]=6

这有什么不对?

1 个答案:

答案 0 :(得分:1)

查看a float converter中的值是提供信息的:

9.0E-44等于0x00000040
4.6007E-41等于0x00008040

2.0等于0x40000000
4.0等于0x40800000

所以你在这里得到的是一个字节序问题。您可以尝试按如下方式声明FloatBuffer

FloatBuffer buffer = ByteBuffer.allocateDirect(16)
                               .order(ByteOrder.LITTLE_ENDIAN)
                               .asFloatBuffer();

或者,如果您愿意,可以反转C ++代码中值的字节顺序。