簡體   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