![](/img/trans.png)
[英]Best way to block / show “Working…” notification when calling a time-consuming Java command externally
[英]java thread blocked when calling a time-consuming native method
我有一个线程将调用本机方法。 而且我不知道为什么当线程调用本机方法时,它将始终停止并等待本机方法完成。 本机方法完成后,线程将继续运行。 问题在于本机方法非常耗时。 但是我希望即使本地方法仍在运行,我的Java线程仍继续运行。我不希望Java线程停止并等待。
本机方法是一个jni函数,它将调用由matlab编码器生成的c文件。在matlab中运行时,该代码仅需1秒。 但是在Android中运行需要15秒。
我的项目的简短演示:
在Java中:
new Thread(new Runnable() {
@Override
public void run() {
//record and get audio samples in real-time as an input to native method
//call native method
//print the result from native method
}).start();
在本机方法中:
JNIEXPORT jobjectArray JNICALL
Java_com_example_user_MyProject_MainActivity_getpitch(JNIEnv *env, jobject instance,jdoubleArray array_) {
//call c function generated by matlab (the input is the array we get from java)
//return the results calculated by the c function to java
}
我的问题是,即使本机方法尚未完成,如果我希望我的java线程继续运行,是否有任何解决方案。(因为我需要实时获取音频样本。如果线程停止,它将无法获得音频样本,然后我们将错过许多样本。)
再次抱歉我的英语不好。。这是我第一次发布问题。
为什么我的Java线程会停止并等待本机方法完成?
线程顺序执行代码。 在本地调用完成之前,它将不会执行代码。
如果我想让我的java线程即使本机方法尚未完成仍继续运行,是否有任何解决方案?
然后使用两个线程:一个用于阻塞对本机库的调用,另一个用于执行您想发生的其他事情。
我不知道为什么当线程调用本机方法时,它将始终停止并等待本机方法完成。
嗯,这就是调用Java方法时发生的事情,对吧? 如果你写这个;
foo(...);
bar(...);
其中foo()
是一个普通的Java方法,那么你就不会想到bar(...)
之前进入foo(...)
的回报,对不对?
那么,如果foo()
恰好具有本机实现,那么为什么您的期望会有所不同呢?
考虑一下:假设您是一些纯Java图形库的作者,并且假设您决定发布一些新的,更快的版本,其中包含一些公共方法的本机实现。 如果将方法更改native
完全改变了他们调用它时会发生的事情,谁会想要移植他们的代码以使用您的新版本?
您可以使用可运行但可异步的Callable对本地代码进行异步调用,然后可以使用Future对象查询结果。
公共类TestCallable实现Callable {
@Override
public String call() throws Exception {
//return the thread name executing this callable task
return yourNativeCall();
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.