gpt4 book ai didi

java - 避免 Android 中 Java 代码生成 JNI 错误

转载 作者:行者123 更新时间:2023-12-01 09:10:12 30 4
gpt4 key购买 nike

我正在为我必须在 Android 中管理的数百个正则表达式开发测试。我遇到了无法阻止的灾难性回溯(即,匹配器进入指数复杂性,似乎处于无限循环中,而实际上,它正在探索大量可能的匹配),所以我需要限制使用超时来整体执行匹配。

我已经找到了一种可能的方法here ,但我还必须从 find() 方法中获取 boolean 返回值,因此 Runnable 不是最佳选择。即使在上面链接中的其他答案中提出的微小变化,为了避免使用线程也是不适用的,因为它基于 CharSequence 的扩展,而该扩展根本不起作用,因为在 matcher.find( 中未使用 charAt ) )(检查了两次,在调试期间都使用了断点,并且还读取了 Matcher 源代码)。 编辑:我第二次发现@NullPointerException already found charAt 从未被调用,但我不知道自 3 年前以来他是否找到了解决方案

所以,到目前为止我发现的最好的选择似乎是使用 FutureTask,它可以指定超时并且还可以返回一个值。我实现了以下代码:

private boolean interruptMatch(final Matcher matcher){

boolean res = false;
ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<Boolean> future =
new FutureTask(new Callable() {
public Boolean call() {
return matcher.find();
}
});
executor.execute(future);

try {
res = future.get(2000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Log.d("TESTER","Find interrupted after 2000 ms");
} catch (ExecutionException e) {
Log.d("TESTER","Find ExecException after 2000 ms");
} catch (TimeoutException e) {
Log.d("TESTER","Find timeout after 2000 ms");
}
future.cancel(true);
executor.shutdownNow();
return res;
}

这部分代码由 main 方法以几乎“经典”的方式调用:

pattern = Pattern.compile(pattern, java.util.regex.Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(inputString);
if (interruptMatch(matcher)) { // before the need to manage catastrophic backtracking here there was a simple if (matcher.find()){
// Do something
}

因此,一切似乎都有效,至少对于前数百个模式(也限制了灾难性回溯长时间运行查找的超时时间),直到出现以下错误:

JNI 错误(应用错误):弱全局引用表溢出(最大值=51200)

它是由上面的java代码生成的(在这个错误没有出现之前 - 显然,取消了导致灾难性回溯的模式),但我不知道如何清理全局引用表,(我找到了一个有关由 JNi 代码直接生成的类似问题的答案(但不是由 Java 生成的),而不是如何找到解决方法或其他有效方法。编辑:我进一步尝试调试,发现调用 get 方法时出现问题。我尝试遵循 FutureTask 的代码,但没有找到任何有用的东西(而且我很快就感到无聊)。

你能帮我一下吗?预先感谢您

最佳答案

经过其他挖掘,我发现有一个 tracked issue在Android中,(它似乎涉及其他主题,但它也回答了我的问题),从回复中我了解到这只是调试过程中出现的问题。我再次测试了我的测试器应用程序,发现这是真的:如果不进行调试,则不会发生上述错误。因此,问题的严重性要低得多,我可以忍受它(对我来说这是一个已解决的问题) –

关于java - 避免 Android 中 Java 代码生成 JNI 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962983/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com