如何使用除GLSurfaceView.Renderer中的本机函数(JNI)之外的nativeGL(C ++)函数

时间:2017-01-03 10:45:18

标签: android opengl-es android-ndk java-native-interface opengl-es-2.0

[EDIT1]

在我的Android应用程序中,我只在我自己的GLSurfaceView.Renderer中使用了本机(C ++)GL函数。我使用了原生GL函数,glUniform4f()/ glEnableVertexAttribArray()/ glBindBuffer()...就像我发布的第二个代码块一样,在SCRendere类的本机函数中

现在,我需要在GLSurfaceView.Renderer中使用(本机)GL函数。

这是GLSurfaceView.Renderer的java代码

class SCRenderer implements GLSurfaceView.Renderer {
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        nativeInit();
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
    nativeResize(w, h);
    }

    public void onDrawFrame(GL10 gl) {
        nativeRender(mSurfaceViewID);
    }

    private static native void nativeInit();
    private static native void nativeResize(int w, int h);
    private static native void nativeRender(int rendererID);

    public int mSurfaceViewID;
}

这是本机GL函数的用例,没有任何问题

JNIEXPORT void
Java_com_samsung_smartcampus_SCRenderer_nativeRender(JNIEnv*  env, jobject thiz, jint surfaceViewID )
{
    appRender(sWindowWidth, sWindowHeight, surfaceViewID);

}


void appRender(int width, int height, int rendererID)
{
    ....
    for (int iIdx = 0; iIdx < pRENDER_PARAMS[0].numObjects; ++iIdx) {
        glUniform4f(colorLoc,
                    pMeshContext[iIdx].vColor.x,
                    pMeshContext[iIdx].vColor.y,
                    pMeshContext[iIdx].vColor.z,
                    1.0f);
        glEnableVertexAttribArray((GLuint)positionLoc);
        glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iIdx].vertexID);
        glVertexAttribPointer((GLuint)positionLoc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);

        glEnableVertexAttribArray((GLuint)normalLoc);
        glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iIdx].normalID);
        glVertexAttribPointer((GLuint)normalLoc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0);

        glDrawArrays(GL_TRIANGLES, 0 , (GLsizei)pMeshContext[iIdx].numVertices);

        glDisableVertexAttribArray((GLuint)positionLoc);
        glDisableVertexAttribArray((GLuint)normalLoc);
    }
    ....

我想要实现的是当我在java中的其他类中打开文件时,我需要在类中使用本机GL。目前我卡住了,因为我认为其他类(文件打开类)可能没有GL上下文。

这是打开java类的文件。

class FileLoader{
    ...
    private void loadSTL(String paths){
        nativeloadSTL(paths);
    }
    ...

    private static native void nativeloadSTL(String paths);
    ...
}

这是本机C ++部分。

void SCFileLoader::loadSTL(const char* path){
    ...
        loader->changeFileSTLtoMeshData(iCnt);
        glGenBuffers(1, &pMeshContext[iCnt].vertexID);
        glGenBuffers(1, &pMeshContext[iCnt].normalID);

        glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iCnt].vertexID);
        glBufferData(GL_ARRAY_BUFFER, pMeshContext[iCnt].numVertices*3*sizeof(GLfloat),
                     pMeshContext[iCnt].vertexCoords, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, pMeshContext[iCnt].normalID);
        glBufferData(GL_ARRAY_BUFFER, pMeshContext[iCnt].numVertices*3*sizeof(GLfloat),
                     pMeshContext[iCnt].vertexNormals, GL_STATIC_DRAW);
    ...
}

正如我在代码块上方所做的那样,GL函数不起作用。我想这是因为没有GL上下文。

有没有解决方法可以解决这个问题?

0 个答案:

没有答案