Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用来自JNI的GetDirectBufferAddress_Java_C_Java Native Interface - Fatal编程技术网

Java 使用来自JNI的GetDirectBufferAddress

Java 使用来自JNI的GetDirectBufferAddress,java,c,java-native-interface,Java,C,Java Native Interface,我试图了解如何从JNI层使用GetDirectBufferAddress。为了理解这一点,我构建了一个非常简单的示例: 公共类我的图片\u信息{ 静止的{ System.loadLibrary(“my_jni”); } 私有java.nio.ByteBuffer image\u info\u bb; 原生静态void initc(java.nio.ByteBuffer bb); 我的图片信息() { image_info_bb=java.nio.ByteBuffer.allocateDirect

我试图了解如何从JNI层使用
GetDirectBufferAddress
。为了理解这一点,我构建了一个非常简单的示例:

公共类我的图片\u信息{
静止的{
System.loadLibrary(“my_jni”);
}
私有java.nio.ByteBuffer image\u info\u bb;
原生静态void initc(java.nio.ByteBuffer bb);
我的图片信息()
{
image_info_bb=java.nio.ByteBuffer.allocateDirect(5*4);
initc(图像信息bb);
}
public java.nio.ByteBuffer getBB(){
返回图像信息;
}
静态公共void main(字符串argv[]){
my_image_info fii=新建my_image_info();
java.nio.ByteBuffer bb=fii.getBB();
System.out.println(“1:+bb.getInt(0));
System.out.println(“2:+bb.getInt(4));
System.out.println(“3:+bb.getInt(8));
System.out.println(“4:+bb.getInt(12));
System.out.println(“5:+bb.getInt(16));
}
然后从本机JNI层:

JNIEXPORT void JNICALL Java\u my\u 1image\u 1info\u initc
(JNIEnv*env,jclass cls,jobject jobj)
{
int*iBuf=(*env)->GetDirectBufferAddress(env,jobj);
iBuf[0]=-2;
iBuf[1]=-1;
iBuf[2]=0;
iBuf[3]=1;
iBuf[4]=2;
}
如果我在这里用openjdk运行这个示例(debian/linux wheezy amd64):

$java-version
java版本“1.6.0_34”
OpenJDK运行时环境(IcedTea6 1.13.6)(6b34-1.13.6-1~deb7u1)
OpenJDK 64位服务器虚拟机(构建23.25-b01,混合模式)
以下是我看到的:

1:-16777217
2: -1
3: 0
4: 16777216
5: 33554432
我了解索引2和3的值。但所有其他值对我来说都没有任何意义,我本以为会出现以下情况:

1:-2
2: -1
3: 0
4: 1
5: 2

我对JNI中的
ByteBuffer
用法有什么误解?

我在文档中遗漏的是,默认情况下
java.nio.ByteBuffer
实际上使用的是
BIG_ENDIAN
字节顺序。这解释了我在
LITTLE_ENDIAN
系统上看到的行为。请参阅参考

我的代码现在是:

image\u info\u bb=java.nio.ByteBuffer.allocateDirect(5*4);
image\u info\u bb.order(java.nio.ByteOrder.LITTLE\u ENDIAN);
默认情况下,它似乎总是
BIG_ENDIAN
,而且迄今为止还没有为
LITTLE_ENDIAN
提供API,正如bug报告(JDK-5043362:(bf)NewDirectByteBuffer始终具有order ByteOrder.BIG ENDIAN)中所解释的那样


最近对文件进行了更新,以反映: