我在我的Java層有一個實現Renderer
的類。在這個類裏面我有一個我想傳遞給JNI層的位圖。 JNI層將負責使用OpenGL顯示位圖。誰能告訴我如何做到這一點?如何通過C++中的OpenGLES在android中顯示位圖?
更新: 我知道有一個開放的GL方法glTexImage2D
其可以被用於顯示一個簡單的2D圖像。任何人都可以告訴我如何使用它?調用這個方法之前和之後我需要做什麼設置?我應該如何將我的位圖傳遞給此方法(從Java到JNI)?
更新2 這是我當前的代碼:
Java類
public class HelloRenderer implements Renderer
{
Context _context;
Bitmap wood;
public void SetContext(Context context)
{
_context = context;
wood = BitmapFactory.decodeResource(_context.getResources(), R.drawable.hello);
}
@Override
public void onDrawFrame(GL10 gl)
{
RenderGLStuff(wood.getWidth(), wood.getHeight(), wood);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
InitGLStuff(wood.getWidth(), wood.getHeight(), wood);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
}
private static native void InitGLStuff(int width, int height, Bitmap ptr);
private static native void RenderGLStuff(int width, int height, Bitmap ptr);
static
{
System.loadLibrary("myglstuff");
}
}
JNI方法
JNIEXPORT void JNICALL Java_mine_NativeGL_HelloRenderer_InitGLStuff(JNIEnv * env, jobject obj, int width, int height, void * ptr)
{
glViewport(0, 0, width, height);
glClearColorx((GLfixed)(0.1f * 65536), (GLfixed)(0.2f * 65536), (GLfixed)(0.3f * 65536), 0x10000);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}
JNIEXPORT void JNICALL Java_mine_NativeGL_HelloRenderer_RenderGLStuff(JNIEnv * env, jobject obj, int width, int height, void * ptr)
{
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &ptr);
}
更新3 我已經更新了我的祖國這樣的代碼,現在我可以看到白盒子代替即時通訊年齡但沒有形象的內容。有任何想法嗎?
JNIEXPORT void JNICALL Java_mine_NativeGL_HelloRenderer_RenderGLStuff(JNIEnv * env, jobject obj, int width, int height, void * ptr)
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
GLfloat vertices[] = { -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, };
GLfloat normals[] = { 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0 };
GLfloat textureCoords[] = { 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0 };
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &ptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, texture);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glNormalPointer(GL_FLOAT, 0, normals);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-5.0, 5.0, -7.5, 7.5, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
你爲什麼這樣做的所有,而不是與正規[Android的GL接口]堅持認爲(http://developer.android.com/guide/topics/graphics/opengl.html)? – genpfault
我知道這很奇怪,但這是要求。事實上,這是我無法實現的整個事情的第一步 –