调用耗时的本机方法

时间:2017-08-23 12:51:51

标签: java android multithreading java-native-interface native

我有一个调用本机方法的线程。而且我不知道为什么当线程调用本机方法时,它将始终停止并等待本机方法完成。本机方法完成后,线程将继续运行。问题是本机方法非常耗时。但我希望我的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线程继续运行,即使本机方法还没有完成,是否有任何解决方案。(因为我需要实时获取音频样本。如果线程停止,它不会得到音频样本。然后我们会错过许多样本。)

对不起我的英语很差..这是我第一次发帖。

3 个答案:

答案 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();
}