Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android没有运行全部功能?_Android_Java Native Interface - Fatal编程技术网

Android没有运行全部功能?

Android没有运行全部功能?,android,java-native-interface,Android,Java Native Interface,我不知道如何更好地界定这个问题。我正在使用JNI做一些图像处理。我有三个JNI调用,一个用于初始化,一个用于图像处理(所以这个调用多次),还有一个用于调用所有destroy/close方法 现在我的问题是,我在销毁后不知何故调用了图像处理调用。我一按后退按钮就呼叫毁灭。我正在使用相机预览,所以我在onSurfaceDestroyed中调用此销毁方法。我将打印语句放入调试。以下是相关的代码片段- public void destroy() { destroyTorch(torchState

我不知道如何更好地界定这个问题。我正在使用JNI做一些图像处理。我有三个JNI调用,一个用于初始化,一个用于图像处理(所以这个调用多次),还有一个用于调用所有destroy/close方法

现在我的问题是,我在销毁后不知何故调用了图像处理调用。我一按后退按钮就呼叫毁灭。我正在使用相机预览,所以我在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,它基本上会销毁任何打开的状态。在该本地调用中有一个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
现在,输出“Closing lua state”这一事实意味着应该执行下面一行,即将torchState设置为0。然而,事实并非如此。我不知道为什么会发生这种情况,但这会导致堆栈问题(显然),因为torchstate不存在,但会在图像处理调用中使用


更重要的是,“Torchtate in destroy”一行从未打印过,这让我相信,由于内存泄漏,该部分在崩溃后执行。这是因为它在不同的线程中吗?为什么呢?有没有办法让它们在同一个线程中运行?毕竟,它们不应该平行运行。

你的陈述中这一行在哪里?”Log.d(“ADebugTag”,“销毁中的torchstate=“+Long.toString(torchstate));”它不应该出现在你的打印报表中吗?我猜您的onDestroy方法没有被调用,也没有将指针设置为0。这正是我要说的。它不在那里。然而,onDestroy正在被调用。注意“关闭lua状态”是如何打印的吗?那是在onDestroy。那里的程序应该返回java,然后执行接下来的两行,输出log.d语句,但它没有。有没有可能从不同的线程调用这些函数?因为在这种情况下,您应该本地存储torchState,将其设置为0,然后调用destroyTorch。同步这两个块也是个好主意。这是一个线程问题。我花了很长时间才为延迟回复感到抱歉。这两个人确实是在不同的思路中运行的。我在这里发布之前检查过,因为这将是一个明显的问题,但我当时找不到。再次感谢。