在网上找了很多的资料,想利用android上层生成Bitmap,然后把Bitmappixel传递给JNI,然后再C++中生成纹理映射,但是结果都失败了。最后自己想得到了一个方法,在android上层直接生成纹理映射,然后把纹理映射的地址传递给JNI,这样就可以利用上层的Bitmap生成纹理映射了。当然这不是最好的方法,但是由于自己现在的能力有限,暂时只能依靠这个方法了,如果有人知道如何正确的利用BitmapC++中生成纹理映射,欢迎和我交流。(我利用BitmapC++中生成了纹理映射,但是纹理是乱纹,而不是正确的纹理,应该是我生成的Bitmappixel数组有问题。)

下面是我的做法,可供参考,如果有更好的方法,请告知:

我想要在OpenGLES中绘制文字,所以首先我利用Canvas生成想要的Bitmap,然后在android上层生成纹理映射,把纹理映射的绑定地址传递个JNI

//定义一个int数组用来保存纹理private int[] TextureString = new int[1];public void onSurfaceCreated(GL10 gl10, EGLConfig eglconfig) {// 从这里开始生成所需BitmapString s = "北京";Bitmap bitmap;// 构建Bitmap,它的width和height必须是2的n次方bitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);// 设置画布背景为透明,这样我们的纹理就只显示文字,而没有颜色背景canvas.drawColor(Color.TRANSPARENT);Paint p = new Paint();// 设置字体、字体大小和字体颜色String familyName = "宋体";Typeface font = Typeface.create(familyName, Typeface.BOLD);p.setColor(Color.RED);p.setTypeface(font);p.setTextSize(50);// 在Bitmap上绘制文字canvas.drawText(s, 300, 60, p);s = "阴,23摄氏度";canvas.drawText(s, 0, 120, p);s = "高温:26,低温: 18 ";canvas.drawText(s, 0, 240, p);// 到这里为止,所需Bitmap构建完成// 从这里开始生成纹理映射gl10.glGenTextures(1, TextureString, 0);// Create Nearest Filtered Texture and bind it to texture 0gl10.glBindTexture(GL10.GL_TEXTURE_2D, TextureString[0]);gl10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);gl10.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST);GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);// 到这里纹理映射完成// 把我们的纹理映射地址传递给JNINative_SolarWind.DrawText(TextureString);// 初始化OpenglES场景设置Native_SolarWind.onSurfaceCreated(gl10, eglconfig, 0, 0);}


到这里为止,上层绑定纹理映射的工作完成。下面是在JNI中调用上层的纹理:

JNI生成的头文件:

/* * Class:     com_ygc_Native_Method * Method:    DrawText * Signature: ([B)V */JNIEXPORT void JNICALL Java_com_ygc_Native_Method_DrawText  (JNIEnv *, jclass, jintArray);


对应的.cpp文件

JNIEXPORT void JNICALL Java_com_ygc_Native_Method_DrawText(JNIEnv *env , jclass cls, jintArray texture){ TextureString = (GLuint *)env->GetIntArrayElements(texture,0);}


其中TextureString变量为一个整型指针变量:extern GLuint *TextureString;用来绑定纹理映射。我们把android上层绑定纹理的整型变量的地址传递给TextureString,这样我们在cpp文件中,就可以利用这个地址来使用上层绑定的纹理了,类似于:glBindTexture(GL_TEXTURE_2D, *TextureString);

由于不能把全部代码贴上来,可能有些人看不太明白,对此我表示抱歉。如果有人需要使用这种方法,有不甚理解,可以回复我,我会详细解答你的疑惑。利用这种方法还有一个问题,就是在第一次渲染的时候,上层的纹理不可使用,必须旋转屏幕,重新加载,才可以正常显示,具体原因还在调查。

当然最好的方法还是在cpp中绑定纹理,但是我现在还没有实现,希望了解此方法的人能给我一些帮助。谢谢。

希望以上文档对你有一些帮助。

更多相关文章

  1. Android(安卓)studio和Eclipse分别生成jar包并混淆jar包
  2. Glide源码解析篇之框架主体结构(一)
  3. android修改按键的映射
  4. android JNI的使用示例详解
  5. Android(安卓)添加新的键值,自定义按键
  6. 修改Android的编译文件使其支持wml
  7. Android(安卓)NDK开发
  8. Android(安卓)Studio apk打包,keystore.jks文件生成,根据keystore
  9. Android处理服务器Openssl生成的RSA加解密

随机推荐

  1. Android一次刷机
  2. ActionBar的使用——低版本兼容
  3. Android访问中央气象台的天气预报API得到
  4. Android(安卓)电话的反射调用机制实现静
  5. Android(安卓)应用软件开发(八)窗口布局
  6. 通过ijetty获取android设备的截图
  7. Does Android(安卓)Support Dual-Cores o
  8. Android(安卓)Service startForeground不
  9. android中dp和px的转换
  10. android camera(二):摄像头工作原理、s5PV