Java NDK,使用FloatBuffer作为参数

Java NDK,使用FloatBuffer作为参数,java,android,android-ndk,java-native-interface,nio,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); } 本机代码实现(我已经测试了它的定义,一切正常): 这与实验的结果有很大的不同 v

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

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

public class MyNDK {

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

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

}
本机代码实现(我已经测试了它的定义,一切正常):

这与实验的结果有很大的不同

value[0]=0.0
value[1]=2
value[2]=4
value[3]=6
怎么了

查看中的值提供了信息:

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

2.0等于0x40000000
4.0等于0x4080000

所以这里有一个持久性问题。您可以尝试按如下方式声明您的
FloatBuffer

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

或者如果你愿意,你可以逆转C++代码中的值的循环性。

<代码> ByteBuffer。AdLoad直接(10)< /Cord>对不起,你说得对。我已经更改了分配大小,但没有更新代码。总之,结果是一样的。我能假设所有的Android设备都是little endian吗?我不确定基于MIPS的Android设备。但是这些是非常罕见的。我认为最好使用
ByteOrder.nativeOrder()
,因为本机库希望缓冲区按本机顺序。
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
FloatBuffer buffer = ByteBuffer.allocateDirect(16)
                               .order(ByteOrder.LITTLE_ENDIAN)
                               .asFloatBuffer();