我正在尝试实现一个函数,该函数在C ++中调用一个名为execute
的主线程上的函数。这就是我到目前为止所做的:
//
// @brief Allows intercommunication between main and secondary threads.
//
template <class... Args>
class Dispatcher final {
public:
#ifdef __APPLE__
// iOS implementation
static void execute(std::function<void(Args...)> handler, Args... args) {
__block auto _args = std::move(args...);
dispatch_async(dispatch_get_main_queue(), ^{
handler(std::move(_args));
});
}
#elif defined(__ANDROID__)
static std::map<size_t, std::pair<std::function<void(Args...)>, Args...>> _callableMapping;
static size_t _lastId;
// Android implementation
static void execute(std::function<void(Args...)> handler, Args... args) {
auto callable = std::make_pair(std::move(handler), std::move(args...));
// store the callable in a map
_callableMapping.insert(std::make_pair(++_lastId, callable));
...
// call a Java method that calls runOnUiThread() which in turn calls
// a JNIEXPORT function, which calls
// __handleExecutionOnMainThread with the same ID that is passed in
}
static void __handleExecutionOnMainThread(size_t callableId) {
auto& mapping = _callableMapping.find(callableId)->second;
// call the function with arguments
mapping->first(std::move(mapping->second...));
}
#endif
};
问题在于,当我从JNIEXPORT函数调用__handleExecutionOnMainThread时,我需要提供Dispatcher<Args...>
的模板参数,此参数目前尚不清楚。
std::function
及其存储在函数auto callable
中的execution
中的args)传递给JAVA,在那里它不会被使用(我想象)它可以存储为object
)并通过runOnUiThread
传回给C ++,以便在__handleExecutionOnMainThread
中执行?
我希望这个问题是可以理解的。如果没有,我可以更详细地解释。