我正在使用枚举模式在我的应用程序中定义单例。我需要访问这个单例的方法,但我似乎无法正确传递单例。
我已经尝试传递枚举并将jobject创建为globalRef,就像这样:
class FrameElapsedListener : public gkEngine::Listener{
public:
JNIEnv* env;
jobject entityManager;
FrameElapsedListener(JNIEnv* env, jobject entityManager) :
env(env),
entityManager(env->NewGlobalRef(entityManager)){}
~FrameElapsedListener(){
env->DeleteGlobalRef(entityManager);
}
void tick(gkScalar rate);
};
但是在使用它时发生了崩溃,“本地参考”超出了这个范围:
jclass entityManagerClass = env->FindClass(entityManagerClassPath.c_str());
jmethodID entityManagerFrameElapsedMethodId = env->GetMethodID(entityManagerClass, "frameElapsed", "(F)V");
env->CallVoidMethod(entityManager, entityManagerFrameElapsedMethodId, rate); //crashes here
现在我正试图从枚举中取出单例,但我不确定如何获取这样的枚举值。有什么建议吗?
答案 0 :(得分:0)
您无法保存JNIEnv指针以在其他线程中使用。您必须通过调用AttachCurrentThread()来获取线程中的新内容。
答案 1 :(得分:0)
我能够通过改变我的方法来解决我的问题,该方法确保单个枚举值的枚举中的单例,到具有私有构造函数,私有实例和getInstance()方法的类。我曾在其他地方读过JNI本身不能使用Java枚举,但我认为既然Enum是一个类,我可以把它当作一个对象。显然,这是不可能的。
答案 2 :(得分:0)
我编写了一个在C ++本机代码中使用Java Enum的库,我编写了一个类似于你的助手类,这里是https://github.com/bugparty/jni_wifi_manager