归志宁无五亩园,读书本意在元元。这篇文章主要讲述Android NDK GLThread相关的知识,希望能为你提供帮助。
我正在尝试使用NDK在android中创建一个简单的动画,不幸的是我的代码抛出了Exception
。
【Android NDK GLThread】A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 16198 (GLThread 739)
我不知道这个错误是什么意思。
这些是我的一些代码。
Coin.cpp
void Coin::Render(GLuint textureId, GLuint positionHandle, GLuint texCoord, GLint matrixHandle, GLint samplerLoc) {
// Bind the texture to this unit
glBindTexture(GL_TEXTURE_2D, textureId);
// Enable generic vertex attribute array
glEnableVertexAttribArray(positionHandle);
glEnableVertexAttribArray(texCoord);
// Prepare the triangle coordinate data
glVertexAttribPointer(positionHandle, 3, GL_FLOAT, GL_FALSE, 0, mVertices);
// Prepare the texture coordinates
glVertexAttribPointer(texCoord, 2, GL_FLOAT, GL_FALSE, 0, mUVCoord);
// Apply the projection and view transformation
glUniformMatrix4fv(matrixHandle, 1, GL_FALSE, 0);
//Set the sampler texture unit to 0, where we have saved the texture
glUniform1i(samplerLoc, 0);
// Draw the triangle
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, mIndices);
// Disable vertex array
glDisableVertexAttribArray(positionHandle);
glDisableVertexAttribArray(texCoord);
}
这就是我声明我的数组
Coin
对象的方式,我认为它看起来像java中的ArrayList<
Coin>
。CoinRenderer.h
vector<
Coin>
mCoinCollection;
这是错误抛出的部分,代码在没有
coin.Render()
或coin.translate()
的情况下工作,但是如果我取消注释这段代码代码不起作用。CoinRenderer.cpp
void CoinRenderer::drawCoin() {
// glUseProgram(programHandle);
glUseProgram(imageHandle);
long slowTime = GLUtils::currentTimeMillis() % 100000L;
int elapse = (int) ((0.01f) * (slowTime));
for (int i = 0;
i <
mCoinCollection.size();
i++) {
Coin coin = mCoinCollection[i];
if (mCurrentTime <
elapse) {
//int nextCoinFace = coin.getNextCoinFace();
//coin.setTextureId(textures[i]);
// This is also the line where the error is throwing.
//coin.translate(0.0f, 0.20f);
}
// This line where the error is throwing.
coin.Render(coin.getTextureId(), mPositionHandle, mTexCoord, mMatrixHandle, mSamplerLoc);
}if (!hasVisibleCoin()) {
LOGD("All coins y <
0");
glDeleteProgram(imageHandle);
}mCurrentTime = elapse;
}
如果需要,这里有一些额外的代码。
CoinRenderer.kt
class CoinRenderer(private val context: Context) : GLSurfaceView.Renderer {override fun onDrawFrame(gl: GL10?) {
nativeDrawFrame()
}override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
nativeSurfaceChange(width, height)
}override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
val assetManager = context.assets
nativeSurfaceCreate(assetManager)
}external fun nativeSurfaceCreate(assetManager: AssetManager)
external fun nativeSurfaceChange(width: Int, height: Int)
external fun nativeDrawFrame()
external fun drawNewCoin(coinSize: Int)
external fun nativeClearSurface(isClearSurface: Boolean)companion object {
init {
System.loadLibrary("coin-lib")
}
}
}
CoinGL.kt
class CoinGL(context: Context) : GLSurfaceView(context) {private var mRenderer : CoinRenderer? = nullinit {
// Set openGL version
setEGLContextClientVersion(2)setZOrderOnTop(true)
setEGLConfigChooser(8, 8, 8, 8, 16, 0)
holder.setFormat(PixelFormat.RGBA_8888)mRenderer = CoinRenderer(context)
setRenderer(mRenderer)renderMode = RENDERMODE_CONTINUOUSLY
}fun drawNewCoin(coinSize: Int) {
queueEvent ({
mRenderer?.drawNewCoin(coinSize)
mRenderer?.nativeClearSurface(false)
})
}
}
PS:我只是Android OPENGL NDK或C ++中的新手,如果您发现或看到一些非常错误的声明或善意使用请向我解释。谢谢。
任何帮助将不胜感激。谢谢。
答案将
vector<
Coin>
mCoinCollection;
改为vector<
Coin*>
mCoinCollection;
推荐阅读
- Android OpenGL camera2纹理分辨率
- 如何在Symfony 3中使用Google Translate免费翻译不同语言的文本
- FOSUserBundle(必须配置路径”fos_user”的子节点”from_email”)
- 如何在Symfony 3中检测移动设备
- 如何在WinForms中为CefSharp启用WebRTC(访问摄像机和麦克风)
- 如何在Symfony 3中将数字转换为单词(数字拼写)
- 如何解决MySQL常规错误(1030从存储引擎得到了139错误)
- 如何在Symfony 3中使用php创建Word文件
- 如何在WinForms中使用C#检索CPU的温度