0

我不知道如何更好地提出这个问题。我正在使用 JNI 进行一些图像处理。我有三个 JNI 调用,一个做初始化,一个做图像处理(所以这个被多次调用)和一个调用所有销毁/关闭方法。

现在我的问题是我在销毁之后以某种方式调用图像处理调用。我在按下后退按钮时调用销毁。我正在使用相机预览,所以我在 onSurfaceDestroyed 中调用了这个销毁方法。我将打印语句用于调试。这些是相关的代码片段 -

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,它基本上会破坏任何打开的状态。该本地调用中有一条打印语句,说明调用成功。现在这是打印语句的顺序 -

Closing lua state  //This is a print in native destroyTorch
Calling torch
torchstate = 462345328923482082342 //The pointer that was supposed to be set to 0

现在输出“Closing lua state”这一事实意味着应该执行以下行,即将torchState设置为0。然而,事实并非如此。我不知道为什么会发生这种情况,但这会导致堆栈问题(显然),因为 torchstate 不存在但在图像处理调用中使用。

更重要的是,“销毁中的火炬状态”这一行从不打印,这让我相信由于内存泄漏,该部分在崩溃后执行。这是因为它在不同的线程中吗?这是为什么?有没有办法让它们在同一个线程中运行?毕竟,它们不应该并行运行。

4

0 回答 0