NDK,使用 FloatBuffer 作为参数
NDK, work with FloatBuffer as parameter
我正在使用 NDK 和本机缓冲区。我有以下代码:
Java class 本地方法定义:
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;
}
}
以及 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++ 代码中反转值的字节顺序。
我正在使用 NDK 和本机缓冲区。我有以下代码:
Java class 本地方法定义:
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;
}
}
以及 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++ 代码中反转值的字节顺序。