Честно говоря, я до сих пор не слышал о контексте openGL (просто прочитал об этом), я начал писать свой код на основе примера проекта сенсорного графика Android: https://github.com/android/ndk-samples/tree/master/sensor-graph. Чтобы ответить на ваш вопрос, у меня нет 'У меня до сих пор были проблемы, и я думаю, что да, но я не уверен на 100%. Перед запросом считанных данных я записываю данные в буфер:
if(dataSize == 0) {
return;
}
bindBuffer(vboIdx);
if(dataSize > vertexBufSize[vboIdx] - offset) {
glBufferData(GL_ARRAY_BUFFER, dataSize, data, GL_STREAM_DRAW);
vertexBufSize[vboIdx] = dataSize;
}
void *ptr = glMapBufferRange(GL_ARRAY_BUFFER, offset, dataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
int err = glGetError();
assert(ptr);
if(data != nullptr) {
memcpy(ptr, data, dataSize);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
unbindBuffer();
Здесь я звоню glBufferData()
Обновление: сторона Java:
mView = (GLSurfaceView) frameLayout.findViewById(R.id.plot_view);
mView.setEGLContextClientVersion(3);
mView.setEGLConfigChooser(true);
if(LOG) Log.d(TAG, "onCreateView(): get ID: " + mView.getId());
isStreaming = true;
mView.setRenderer(new GLSurfaceView.Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
mLiveViewJNI.surfaceCreated();
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
mLiveViewJNI.surfaceChanged(width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
mLiveViewJNI.drawFrame();
}
});
Обновление: @Matic Oblak Вы были правы, контекст на самом деле был проблемой. Пока я только касался буферов через JNI в onSurfaceCreated, onSurfaceChanged или onDrawFrame, все было хорошо. Но как только я попытался получить к ним доступ, например, через mLiveViewJNI.dummyCall, я столкнулся с этой проблемой, и все вернуло 0 или NULL. Спасибо:)!