将C ++对象传递给JAVA并使用JNI返回

时间:2015-12-23 11:07:50

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

我正在尝试实现一个函数,该函数在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...>的模板参数,此参数目前尚不清楚。

然后我想到了一种不同的方法。是否可以将C ++对象(即std::function及其存储在函数auto callable中的execution中的args)传递给JAVA,在那里它不会被使用(我想象)它可以存储为object)并通过runOnUiThread传回给C ++,以便在__handleExecutionOnMainThread中执行?

我希望这个问题是可以理解的。如果没有,我可以更详细地解释。

0 个答案:

没有答案