C ++ / Java绑定:应该在哪一方实现多线程?

时间:2015-07-31 13:06:39

标签: java c++ objective-c download java-native-interface

我正在我的库中实现一个名为HttpDataStream的C ++类。我必须进行JNI绑定才能在Android下使用我的库,使用iOS的Objective-C绑定。

我需要在Java和Objective-C中创建一个专用的HttpDataStream类,但我想知道这些类是否会在下载完成之前实际阻止整个应用程序。

例如,让我们从“Android端”的read课程中调用HttpDataStream方法:

std::streamsize DataStreamJava::read(double value) {
  jmethodID m = jni->GetMethodID(j_dataStream_class_,
                                 "read", "(D)J");
  jni->CallLongMethod(j_dataStream_global_, m);
  return 0;
}

假设read方法将下载文件并返回下载的字节数。我目前正在考虑,即使我在“Android端”使用Threads和Runnables,C ++库实际上会阻塞,直到下载完成。

所以我问自己以下问题:

  • 是否应该在C ++和Java端实现多线程?
  • 我应该在C ++中实现一个DataStreamObserver,下载完成后会调用它吗?

2 个答案:

答案 0 :(得分:1)

如果这是一个更长的下载操作,那么在Android下,建议从线程内部(可能是前台)服务进行。这样一旦用户隐藏它,系统就不会杀死你的应用程序。在这个场景中,最好在java端创建线程。

在我正在处理的应用程序中,我有许多本机代码,它们在自己的本机线程中执行。此代码通过调用java类上的方法来进行HTTP通信 - 这包含各种android HTTPClient方法。这些数据主要是少量的。

所以:

  

是否应该在C ++和Java端实现多线程?

对于少量数据我会在C ++代码中进行线程化并调用包装HTTPClient或URL的java类。你可以使用这个pthreads,它应该适用于android和ios几乎没有变化。

对于大量数据,至少在android下 - 使用服务中的java线程。这实际上很难对像c ++中的read这样的操作进行编码。

我不确定流式数据,我理解是你的情况,如果你需要立即数据 - 那么原生线程应该是最好的。

答案 1 :(得分:1)

答案取决于您对多线程的期望:

a)在一方流水线化相关行动

如果Java端的read()执行多个依赖操作,例如读取,解释或预处理数据,并最终渲染数据,则可以考虑在java端执行多线程处理。

但是你在那边做,你对流类'read()的单次调用只有在java端的所有mutlithreaded动作完成时才会返回。所以是的,在这种情况下,C ++代码被卡住了,等待返回。

b)做一些无关的事情

因此,如果您希望C ++代码在读取数据时执行其他操作,但与获取的数据无关,则应考虑在C ++端执行多线程处理(不要忘记将JNI环境附加到新线程!)。

c)管道双方的相关行动

但是如果你必须通过Java处理C ++方面的某些部分获取数据(例如,开始显示数据),那么你可以选择以下两种方法之一:

  • 在C ++中进行多线程处理,前提是您可以同时访问在java中读取的数据(例如,读取小块,或者允许访问正在填充的缓冲区的java函数)
  • java中的多线程调用本机C ++函数作为回调,每当某些部分数据准备就绪时:在这种情况下,JNI将负责在与Java线程对应的不同线程中运行每个回调C ++函数。

java或C ++中的obsrever

这取决于您选择和与先前选择相关的约束。如果不了解更多信息,很难为您提供客观有用的建议。