繁体   English   中英

调用耗时的本机方法时Java线程被阻止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM