我有一个调用本机方法的线程。而且我不知道为什么当线程调用本机方法时,它将始终停止并等待本机方法完成。本机方法完成后,线程将继续运行。问题是本机方法非常耗时。但我希望我的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线程继续运行,即使本机方法还没有完成,是否有任何解决方案。(因为我需要实时获取音频样本。如果线程停止,它不会得到音频样本。然后我们会错过许多样本。)
对不起我的英语很差..这是我第一次发帖。
答案 0 :(得分:3)
为什么我的java线程会停止并等待本机方法完成?
线程顺序执行代码。在本机调用完成之前,它不会执行代码。
如果我希望我的java线程继续运行,即使本机方法还没有完成,是否有任何解决方案。
然后使用两个线程:一个用于阻止对本机库的调用,另一个用于执行您想要发生的任何其他操作。
答案 1 :(得分:0)
我不知道为什么当调用本机方法的线程时,它总会停止并等待本机方法完成。
那么,当你调用 Java 方法时会发生什么,对吧?如果你写这个;
foo(...);
bar(...);
foo()
是常规Java方法,那么在bar(...)
返回之前你不希望输入foo(...)
,对吗?
那么,如果foo()
碰巧有本机实现,为什么你的期望会有所不同呢?
考虑一下:假设您是某些纯Java图形库的作者,并假设您决定使用某些公共方法的本机实现来发布新的更快版本。如果将方法更改为native
会完全改变他们调用时发生的情况,谁会想要将代码移植到使用新版本?
答案 2 :(得分:0)
您可以使用可运行但异步的Callable将本机代码调用为async,然后可以使用Future Object查询结果。
公共类TestCallable实现Callable {
@Override
public String call() throws Exception {
//return the thread name executing this callable task
return yourNativeCall();
}