2

我正在使用枚举模式在我的应用程序中定义一个单例。我需要访问这个单例的方法,但我似乎无法正确传递单例。

我已经尝试通过枚举并创建一个作为 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

现在我试图将单例从枚举中取出,但我不确定如何获取这样的枚举值。有什么建议吗?

4

3 回答 3

0

通过将确保单例的方法从具有单个枚举值的枚举更改为具有私有构造函数、私有实例和 getInstance() 方法的类,我能够解决我的问题。我在其他地方读到过 JNI 不能原生使用 Java 枚举,但我认为由于 Enum 是一个类,我可以将它视为一个对象。显然,这是不可能的。

于 2013-06-24T18:19:39.797 回答
0

我写了一个在 C++ 本机代码中使用 Java Enum 的库,我写了一个与你的类似的帮助类,在这里,https://github.com/bugparty/jni_wifi_manager

于 2014-01-03T11:36:49.987 回答
0

您不能保存 JNIEnv 指针以在不同的线程中使用。您必须通过调用 AttachCurrentThread() 在线程中获取一个新线程。

于 2013-06-20T22:32:32.147 回答