Must use a native order direct Buffer错误,在android SDK2.2的环境下如何解决???
我在1.5的环境下,可以运行,但是在2.2的环境下就不能运行了。哪位大虾能告诉我在2.2下,怎么配置才能使其运行不?谢谢了
代码如下:public class GLRender implements Renderer
{
 int one = 0x10000;

 //三角形三个顶点
 private IntBuffer triggerBuffer = IntBuffer.wrap(new int[]{
0,one,0, //上顶点
-one,-one,0,    //左下点
one,-one,0,});  //右下点
 //正方形的4个顶点
 private IntBuffer quaterBuffer = IntBuffer.wrap(new int[]{
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0});
@Override
public void onDrawFrame(GL10 gl)
{
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 重置当前的模型观察矩阵
gl.glLoadIdentity();

// 左移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(-1.5f, 0.0f, -6.0f);

// 允许设置顶点
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 设置三角形
gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
//绘制三角形
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

// 重置当前的模型观察矩阵
    gl.glLoadIdentity();
    // 左移 1.5 单位,并移入屏幕 6.0
    gl.glTranslatef(1.5f, 0.0f, -6.0f);
    //设置和绘制正方形
    gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);     // 取消顶点设置
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    
} @Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
float ratio = (float) width / height;
//设置OpenGL场景的大小
gl.glViewport(0, 0, width, height);
//设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
// 设置视口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity(); } @Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);

// 黑色背景
gl.glClearColor(0, 0, 0, 0);

// 设置深度缓存
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);

// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}}在2.2的环境下,运行出错的信息如下:
05-29 13:37:12.401: ERROR/AndroidRuntime(407): FATAL EXCEPTION: GLThread 8
05-29 13:37:12.401: ERROR/AndroidRuntime(407): java.lang.IllegalArgumentException: Must use a native order direct Buffer
05-29 13:37:12.401: ERROR/AndroidRuntime(407):     at com.google.android.gles_jni.GLImpl.glVertexPointerBounds(Native Method)
05-29 13:37:12.401: ERROR/AndroidRuntime(407):     at com.google.android.gles_jni.GLImpl.glVertexPointer(GLImpl.java:1121)
05-29 13:37:12.401: ERROR/AndroidRuntime(407):     at com.open.gl.OpenGLReader.onDrawFrame(OpenGLReader.java:36)
05-29 13:37:12.401: ERROR/AndroidRuntime(407):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1332)
05-29 13:37:12.401: ERROR/AndroidRuntime(407):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)

解决方案 »

  1.   

    : java.lang.IllegalArgumentException说明1.5和2.2的API接口已经发生变换,你需要修改成使用2.2的API
      

  2.   

    现在顶点数据一般都类似这么写,应该能运行: private void initVertex(){
    float[] vertexArray = new float[] {
        -1.0f, -1.0f, 0.0f,
         1.0f, -1.0f, 0.0f,
        -1.0f,  1.0f, 0.0f,
         1.0f, -1.0f, 0.0f,
         1.0f,  1.0f, 0.0f,
        -1.0f,  1.0f, 0.0f
    }; ByteBuffer vtxByteBuffer = ByteBuffer.allocateDirect(vertexArray.length * 4);
    vtxByteBuffer.order(ByteOrder.nativeOrder());
    vertexBuffer = vtxByteBuffer.asFloatBuffer();
    vertexBuffer.put(vertexArray);
    vertexBuffer.position(0);
    }
      

  3.   

    哦,int型数据是 vtxByteBuffer.asIntBuffer();
      

  4.   

    创建工程的时候把sdk的最小兼容版本设置到1.5的版本就可以了,因为里面调用到了以前sdk的接口,后面已经去除了
      

  5.   

    版本一致很重要,用sdk manager更新下
      

  6.   

    貌似2.2对openGL接口支持的不是很好。
      

  7.   

    如对OpenGL的es扩展什么的都支持的不是很好!