简体   繁体   English

如何从Android中的Native C / C ++调用Java API

[英]How to call Java API's from Native C/C++ in Android

There are lot of examples that Android C/C++ native calls Java APIs. Android C / C ++本机调用Java API有很多例子。 However, all of these examples I have read are the Android Java APIs call native first and then the native calls other Java APIs by using the passed JNI-ENV. 但是,我读过的所有这些示例都是Android Java API首先调用本机,然后本机通过使用传递的JNI-ENV调用其他Java API。

Without the passed JNI-ENV, how can the C/C++ get it? 没有通过的JNI-ENV,C / C ++怎么能得到它? Is it possible that C/C++ native calls Java APIs in Android by creating JavaVM ?If so please share the links. C / C ++本机是否有可能通过创建JavaVM来调用Android中的Java API?如果是这样,请分享链接。 I have gone through the one project CoCos2dx which iam unable to find clear details. 我已经完成了一个项目CoCos2dx,我无法找到明确的细节。 github.com/nokia-developer/cocos2d-x-qt/tree/master/ github.com/nokia-developer/cocos2d-x-qt/tree/master/

Thanks in advance! 提前致谢!

Here's how I do it. 这是我如何做到的。 I found out how by referring to The Java Native Interface by Sheng Liang; 我找到了如何通过参考盛良的Java Native Interface ; see page 96. I have a class called ThreadEnv that owns a JNIEnv pointer for the current thread and creates it when it's first needed: 请参阅第96页。我有一个名为ThreadEnv的类,它拥有当前线程的JNIEnv指针,并在首次需要时创建它:

class ThreadEnv
    {
    public:
    JNIEnv* GetEnv()
        {
        if (m_env == nullptr)
#if defined(ANDROID) || defined(__ANDROID__)
            TheJvm->AttachCurrentThread(&m_env,nullptr);
#else
            TheJvm->AttachCurrentThread((void**)&m_env,nullptr);
#endif
        return m_env;
        }
    ~ThreadEnv()
        {
        if (m_env)
            TheJvm->DetachCurrentThread();
        }

    private:
    JNIEnv* m_env = nullptr;
    };

I then use it by making a ThreadEnv object a member of any C++ class that needs it in my JNI code, and calling GetEnv to get the JNIEnv pointer. 然后我通过使ThreadEnv对象成为我的JNI代码中需要它的任何C ++类的成员,并调用GetEnv来获取JNIEnv指针来使用它。 Here's an example of how I use it in one of my classes: take a look at the OnChange member function. 以下是我在其中一个类中使用它的示例:查看OnChange成员函数。

class MyFrameworkObserver: public MFrameworkObserver, public MUserData
    {
    public:
    MyFrameworkObserver(jobject aFrameworkObject): m_framework_object(aFrameworkObject) { }
    ~MyFrameworkObserver()
        {
        JNIEnv* env = m_thread_env.GetEnv();
        if (env)
            env->DeleteGlobalRef(m_framework_object);
        }

    private:
    void OnViewChange() override { OnChange(TheFrameworkOnViewChangeMethodId); }
    void OnMainDataChange() override { OnChange(TheFrameworkOnMainDataChangeMethodId); }
    void OnDynamicDataChange() override { OnChange(TheFrameworkOnDynamicDataChangeMethodId); }

    void OnChange(jmethodID aMethodID)
        {
        JNIEnv* env = m_thread_env.GetEnv();
        if (env)
            env->CallVoidMethod(m_framework_object,aMethodID);
        }

    jobject m_framework_object;
    ThreadEnv m_thread_env;
    };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM