java - Android NDK OpenGL ES 渲染图形到 Java 位图

标签 java android c opengl-es android-ndk

我在从 OpenGL ES 1.0 渲染中检索位图时遇到了麻烦。图形渲染是在 Android NDK 中完成的,我想在 Android Java 中显示位图。我知道我必须使用 glReadPixels 函数。

我尝试将位图对象传递给 NDK 并对其进行修改,如 NDK 的位图等 ionic 示例中所示,但发生了错误:“GL_INVLID_EXCEPTION”并且位图未受影响。我尝试过与 ABGR 位图的组合,但没有成功。有我的代码:

void Java_com_example_polygonmap_PolygonMapyActivity_ndkOpenGLInit( JNIEnv*  env, jobject  obj, jobject bitmap ) {
AndroidBitmapInfo info;
int ret;
GLvoid* pixs;

if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) {
    LOGI("AndroidBitmap_getInfo() failed ! error=%d", ret);
    return;
}
if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixs)) < 0) {
    LOGI("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glShadeModel( GL_FLAT );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
///
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, 400, 400 );
glOrthof( 0.0f, (float)400, 0.0f, (float)400, -1.0f, 1.0f );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState( GL_VERTEX_ARRAY );
glDisable( GL_TEXTURE_2D );
///
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glDisable( GL_TEXTURE_2D );
glVertexPointer(2, GL_FLOAT, 0, polygon[0]);
glColor4f(0.0f,0.0f,1.0f,1.0f);
glDrawArrays( GL_LINE_LOOP, 0, 3 );
glDisableClientState(GL_VERTEX_ARRAY);
glReadPixels(0, 0, 400, 400, GL_RGB, GL_UNSIGNED_BYTE, &pixs);
////
AndroidBitmap_unlockPixels(env, bitmap);

我尝试了另一种方法,通过使用 glReadPixels 读取我自己的 unsigned char 数组,将其传递给 Java,并在此处从数组创建位图。现在像素读取不返回任何异常,但我在尝试将字节数组解析为位图时遇到了麻烦,所以这种方式也失败了。代码几乎相同,但没有位图初始化和像素读取部分略有不同:

jbyteArray Java_com_example_polygonmap_PolygonMapyActivity_ndkOpenGLInit( JNIEnv*  env, jobject  obj)
{
void* pixs;
unsigned char ch[256*256*4];

glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glShadeModel( GL_FLAT );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
///
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, 256, 256 );
glOrthof( 0.0f, (float)256, 0.0f, (float)256, -1.0f, 1.0f );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState( GL_VERTEX_ARRAY );
glDisable( GL_TEXTURE_2D );
///
glClear( GL_COLOR_BUFFER_BIT);
glDisable( GL_TEXTURE_2D );
glVertexPointer(2, GL_FLOAT, 0, polygon[0]);
glColor4f(1.0f,0.0f,0.0f,1.0f);
glDrawArrays( GL_LINE_LOOP, 0, 3 );
glDisableClientState(GL_VERTEX_ARRAY);
glReadPixels(0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, &pixs);
jcharArray jch = (*env)->NewCharArray(env, 256*256*4);
(*env)->SetCharArrayRegion(env, jch, 0 , 256*256*4, &ch);

这是位图 Java 代码的字节数组:

Bitmap b = BitmapFactory.decodeByteArray(ch.toString().getBytes(), 0 , ch.toString().getBytes().length);

我的渲染是在 GLSurfaceView 上完成的,并在 native c 中实现,它工作正常,除了位图导入。

如果有任何帮助,我将不胜感激。

提前致谢。

最佳答案

glReadPixels(0, 0, 400, 400, GL_RGB, GL_UNSIGNED_BYTE, &pixs);

应该是 pix 而不是 &pix:(没有“&” - 否则它是本地地址变量不是指向像素数据的指针)

glReadPixels(0, 0, 400, 400, GL_RGB, GL_UNSIGNED_BYTE, pixs);

关于java - Android NDK OpenGL ES 渲染图形到 Java 位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13350961/

相关文章:

android - 当 SDCard 已满时抛出 IOException

javascript - Android Webview - javascript 屏幕尺寸与实际屏幕尺寸

android - Ionic Firebase 在通知点击后获取数据

C 文件处理 : Text doesn't append at the end of the file

java - 在已排序的 HashMap 中选择顶部 'n' 条目

java - 使用 Java 8 从过去获取 Unix 时间戳

使用 `memmove` 循环移动数组

c - 数组指针的地址,&array

java - 使用 GNU Compiler for Java 而不是 Sun JDK 编译 Java 时的差异

java - java中防止线程重复处理