我不知道如何更好地构建这个问题。我正在使用JNI进行一些图像处理。我有三个JNI调用,一个用于初始化,一个用于图像处理(因此这个被多次调用),一个用于调用所有的销毁/关闭方法。
现在我的问题是我以某种方式调用图像处理调用AFTER destroy。我按下后退按钮叫破坏。我正在使用相机预览,所以我在onSurfaceDestroyed中调用了这个destroy方法。我把print语句调试。这些是相关的代码片段 -
public void destroy()
{
destroyTorch(torchState);
torchState = 0;
Log.d("ADebugTag", "torchstate in destroy = " + Long.toString(torchState));
}
这是上面调用的本机函数 -
JNIEXPORT void JNICALL Java_com_example_torchandroid_CameraClass_destroyTorch(JNIEnv *env, jobject thiz,jlong torchStateLocation)
{
__android_log_print(ANDROID_LOG_INFO, "Torchandroid", "Closing lua state");
lua_State *L = (lua_State*) torchStateLocation;
lua_close(L); //Close lua state.
}
这是执行图像处理的本机调用。调用上述内容后,以下内容不起作用。
start = SystemClock.elapsedRealtime();
bProcessing = true;
if(torchState != 0)
{
Log.d("ADebugTag", "Calling torch");
Log.d("ADebugTag", "torchstate = " + Long.toString(torchState));
callTorch(torchState, PreviewSizeWidth, PreviewSizeHeight, FrameData, pixels);
}
bitmap.setPixels(pixels, 0, PreviewSizeWidth, 0, 0, PreviewSizeWidth, PreviewSizeHeight);
destroy方法调用native,它基本上会破坏任何打开的状态。该本机调用中有一个print语句,表明调用成功。现在这是打印语句的顺序 -
Closing lua state //This is a print in native destroyTorch
Calling torch
torchstate = 462345328923482082342 //The pointer that was supposed to be set to 0
现在输出“关闭lua状态”这一事实意味着应该执行以下行,即将torchState设置为0。但事实并非如此。我不知道为什么会发生这种情况,但这会导致堆栈问题(显然),因为torchstate不存在但会在图像处理调用中使用。
更重要的是,“毁灭中的火炬”系列永远不会打印,这让我相信部件在崩溃后由于内存泄漏而执行。这是因为它是在不同的线程?这是为什么?有没有办法让它们在同一个线程中运行?毕竟,它们不应该并行运行。