gpt4 book ai didi

java - NDK,使用 FloatBuffer 作为参数

转载 作者:行者123 更新时间:2023-12-02 04:07:06 30 4
gpt4 key购买 nike

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

带有 native 方法的 Java 类定义:

public class MyNDK {

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

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

}

native 代码实现(我测试了它的定义,没问题):

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

以及在 Activity 中用于测试结果的代码:

    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

怎么了?

最佳答案

查看 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++ 代码中值的字节顺序。

关于java - NDK,使用 FloatBuffer 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34168791/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com