有许多Android C / C ++本机调用Java API的示例。但是,我读过的所有这些示例都是Android Java API首先调用本机,然后本机通过使用传递的JNI-ENV调用其他Java API。
如果没有通过JNI-ENV,C / C ++怎么能得到它? C / C ++本机是否有可能通过创建JavaVM来调用Android中的Java API?如果是这样,请分享链接。 我已经完成了一个项目CoCos2dx,我无法找到明确的细节。 github.com/nokia-developer/cocos2d-x-qt/tree/master /
提前致谢!
答案 0 :(得分:0)
这就是我的方法。通过参考盛亮的The Java Native Interface,我发现了如何;参见第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;
};
然后,通过使ThreadEnv对象成为JNI代码中需要它的任何C ++类的成员,并调用GetEnv以获取JNIEnv指针,来使用它。这是我在一个类中如何使用它的示例:看一下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;
};