Can';在NDK项目中,不要从android_main调用任何JNI功能 我将使用VisualStudio模板将现有的C++游戏移植到Android NDK。我已经实现了需要通过java路由的功能,我不能得到运行时允许C++代码调用JVM。
我有一个Java类JNIActivityBridge,它扩展了NativeActivity并提供了一些有用的代码。从OnCube中,我可以调用C++本地函数,函数可以无缝调用回java。我用它来验证我的基本JNI代码是正确的,并且我在这个特定的垫片中所做的一切都很好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
//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的对象)