前言:如果在Android1.5版本中使用上面数组形式表示顶点,不会出现任何问题,但在Android1.6版本以上运行就会出现java.lang.IllegalArgumentException: Must use a native order direct Buffer这个错误。
关于openGl中IllegalArgumentException异常
一、Android4.0系统的下载与编译
一、引入
int one = 0x10000;
// 三角形的3个顶点
private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]
&nbnbsp; { 0, one, 0, //上顶点
-one, -one, 0, //左下顶点
one, -one, 0, }); //右下顶点
如果在Android1.5版本中使用上面数组形式表示顶点,不会出现任何问题,但在Android1.6版本以上运行就会出现java.lang.IllegalArgumentException: Must use a native order direct Buffer这个错误。出现这个错误是因为 OpenGL是一个非常底层的画图接口,它所使用的缓冲区存储结构是和java程序中不相同的。Java是大端字节序(BigEdian),而OpenGL所需要的数据是小端字节序(LittleEdian)。所以,我们需要 Java 的缓冲区转化为 OpenGL 可用的缓冲区
二、大端排序和小端排序
说到这里肯定会有人提出什么是大端排序和小端排序?下面来简单介绍一下:
(1)大端排序(BigEdian):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
(2)小端排序(LittleEdian):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 -----------------> 高地址
&nnbsp; 0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 -----------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
三、解决方案
解决方法很简单,就是将Java的大端排序方式转换成openGL的小端排序即可,这里提供一个工具类BufferUtil来进行排序方式的转换,代码如下:
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
public class BufferUtil {
public static IntBuffer intBuffer;
public static IntBuffer iBuffer(int[] a) {
// 先初始化buffer,数组的长度*4,因为一个float占4个字节
ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
&nbnbsp; // 数组排列用nativeOrder
mbb.order(ByteOrder.nativeOrder());
intBuffer = mbb.asIntBuffer();
intBuffer.put(a);
intBuffer.position(0);
return intBuffer;
}
}
使用工具类:
int one = 0x10000;
// 三角形的3个顶点
private IntBuffer triggerBuffer = BufferUtil.iBuffer((new int[]
{ 0, one, 0, // 上顶点
-one, -one, 0, // 左下顶点
one, -one, 0, })); // 右下顶点
文章出自:http://qh.itpxw.cn/peixun/software/201842384.html
文章标题:如何了解openGl中IllegalArgumentException异常
免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员
用户级别:10
机构名称:IT培训网
联 系 人:罗老师
联系电话:13783581536
联系手机:13783581536
在线客服:
在 线 QQ:
电子邮件:
网站域名:http://www.itpxw.cn
注册时间:2016-07-18 11:07
最后登录:2024-02-20 13:02
Java定义方法的格式是什么?IT培训网小编来告诉大家。所谓方法...
大家在Java教程中会学到关于Java消息推送的知识,那么,Java消息...
常用的Java日期格式转换有哪些?IT培训网小编来告诉大家。 1...
Java创建对象数组的方法是什么?IT培训网小编来告诉大家。Ja...