Can';在NDK项目中,不要从android_main调用任何JNI功能 我将使用VisualStudio模板将现有的C++游戏移植到Android NDK。我已经实现了需要通过java路由的功能,我不能得到运行时允许C++代码调用JVM。

Can';在NDK项目中,不要从android_main调用任何JNI功能 我将使用VisualStudio模板将现有的C++游戏移植到Android NDK。我已经实现了需要通过java路由的功能,我不能得到运行时允许C++代码调用JVM。,java,android,c++,android-ndk,Java,Android,C++,Android Ndk,我有一个Java类JNIActivityBridge,它扩展了NativeActivity并提供了一些有用的代码。从OnCube中,我可以调用C++本地函数,函数可以无缝调用回java。我用它来验证我的基本JNI代码是正确的,并且我在这个特定的垫片中所做的一切都很好 //everything here works totally fine and I have no problems JNIEXPORT void JNICALL Java_com_kata_JNIActivity

我有一个Java类JNIActivityBridge,它扩展了NativeActivity并提供了一些有用的代码。从OnCube中,我可以调用C++本地函数,函数可以无缝调用回java。我用它来验证我的基本JNI代码是正确的,并且我在这个特定的垫片中所做的一切都很好

//everything here works totally fine and I have no problems
JNIEXPORT void JNICALL         Java_com_kata_JNIActivityBridge_InitializeJNIStuff(JNIEnv * env, jobject obj)
{
    JniEnv = env;
    ActivityBridge = obj;
    PlatformSupportClass = env->FindClass("com/kata/PlatformSupport");
    ActivityBridgeClass = env->FindClass("com/kata/JNIActivityBridge");
    TestMethod = env->GetMethodID(ActivityBridgeClass, "AlertTest", "()V");
    env->CallVoidMethod(ActivityBridge, TestMethod);
    LOGI("JNI Active");
    return;
}
我无法工作的是来自主应用程序线程的任何JNI调用(将其调用堆栈追溯到android_main的代码)。我调用了AttachCurrentThread,但是FindClass失败,如果我使用从活动垫片缓存的jclass,GetMethodID失败,当然我不能调用Java。在这一点上,我只需要在这个游戏运行时调用一些简单的Java函数,我一辈子都不知道如何从我的主线程返回JVM。为了从这个线程/上下文中使用Java函数,我需要什么

void android_main(struct android_app* state) {
    struct engine engine;

    memset(&engine, 0, sizeof(engine));
    state->userData = &engine;
    state->onAppCmd = engine_handle_cmd;
    state->onInputEvent = engine_handle_input;
    engine.app = state;
    AppEngine = &engine;

    Jvm = state->activity->vm;
    state->activity->vm->AttachCurrentThread(&engine.jni, nullptr);
    //--- none of the following calls work here ---
    jclass cl = engine.jni->FindClass("com/kata/PlatformSupport");
    jmethodID mt = engine.jni->GetStaticMethodID(cl, "TestCallAdd", "(I)I");
    jint add = engine.jni->CallStaticIntMethod(cl, mt, 3);

    if(state->savedState != NULL) {
        // We are starting with a previous saved state; restore from it.
        engine.state = *(struct saved_state*)state->savedState;
    }

    GameMain(0, 0);
}

来自Google groups的一个老讨论:“[这]将只允许您访问android框架类(android.app.Activity等),但此默认类加载器无法访问您的Java类(不属于android框架),您需要从活动中检索类加载器(使用方法
getClassLoader()
)并使用类加载器的
loadClass
方法(只需将jobject强制转换为返回到jclass的对象)