我目前有一个Java ByteBuffer,它已经拥有Big Endian格式的数据.然后我想写一个二进制文件作为Little Endian.
这是在Big Endian中编写文件的代码:
public void writeBinFile(String fileName, boolean append) throws FileNotFoundException, IOException
{
FileOutputStream outStream = null;
try
{
outStream = new FileOutputStream(fileName, append);
FileChannel out = outStream.getChannel();
byteBuff.position(byteBuff.capacity());
byteBuff.flip();
byteBuff.order(ByteOrder.LITTLE_ENDIAN);
out.write(byteBuff);
}
finally
{
if (outStream != null)
{
outStream.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,byteBuff是一个以Big Endian格式填充的ByteBuffer.
我的最后一种方法是创建另一个缓冲区并将ByteBuffer设置为little endian然后从原始(big endian)缓冲区读取"getInt"值,并将值"setInt"设置为little endian缓冲区的强力方法.我想有更好的方法......
我对JNI比较陌生,并且已经解决了使用JNI在Java对象中弄乱整数和数组的基础知识.现在我正在尝试修改/访问Java对象中的Java对象.
我一直在互联网和Stack Overflow上搜索,还没有找到如何做到这一点.
这是一个例子.
在Java中:
public class ObjectOne
{
private byte[] buff;
...
...
}
public class ObjectTwo
{
private ObjectOne obj;
...
...
}
Run Code Online (Sandbox Code Playgroud)
在JNI中,如何通过ObjectTwo从ObjectOne访问"buff"?我试过这样的事......
JNIEXPORT void JNICALL Java_accessBuffThroughObjectTwo(JNIEnv *env, jobject obj, jobject objectTwo)
{
jclass clazz;
jclass bufferClazz;
jobject bufferJObject;
clazz = (*env)->GetObjectClass(env, objectTwo);
fid = (*env)->GetFieldID(env, clazz, "obj", "Ljava/lang/Object;");
bufferJObject = (*env)->GetObjectField(env, javascsicommand, fid);
bufferClazz = (*env)->GetObjectClass(env, bufferJObject); <-- Fails here for Access Violation
fid = (*env)->GetFieldID(env, bufferClazz, "buff", "[B");
}
Run Code Online (Sandbox Code Playgroud)
对我做错的任何帮助?