0

我正在尝试将字节转换为 JNI 中的浮点数。如果我在调用 GetByteArrayElements 方法时键入 cast 它,它就不起作用。打印出浮点变量会打印出一个指针。我知道它是一个指针,因为通常它类似于“123451234993305848212225.000000” 但是,如果我在 printf 语句中将其强制转换为浮点数,它会显示正确的值。为什么会这样?我有以下两组代码片段-

jbyte *testTensor_data = (env)->GetByteArrayElements(NV21FrameData,0);
__android_log_print(ANDROID_LOG_INFO, "Torchandroid", "C test print: %f",(float) (testTensor_data[0]));

这行得通。print 语句显示正确的数字。

jfloat *testTensor_data = (float*) (env)->GetByteArrayElements(NV21FrameData,0);
__android_log_print(ANDROID_LOG_INFO, "Torchandroid", "C test print: %f",(testTensor_data[0]));

这第二种方法不起作用。问题是,简单地打印出一个浮点数对我没有用。我需要将它用作浮点数并将其作为浮点数进行操作,这是第二种方法,但它不起作用。

4

1 回答 1

1

例子并不相同。在第一种情况下是testTensor_data[0]( jbyte) ,在第二种情况下是( )。它不是正在打印的指针,而是大约 4 个字节被转换为单个浮点数。sizeof(jbyte)==1floatsizeof(jfloat)==4

为了方便地处理 12 位数据,您可以执行以下操作:

struct 3pix {
    int a:12;
    int b:12;
};

希望它不会被填充,然后访问((struct 3pix*)test_Tensor_data)->a或类似的东西。我认为这并不容易。另一种解决方案 - 更自然 - 是使用按位运算,但您必须正确计算。

于 2013-06-02T00:19:04.057 回答