在做ogre Android版的时候,需要用到c与java有互相调用。ogre Android版采用的是纯c++的方式,调用android_native_app_glue中Android_main的方法。在修改为jni方式,用java写窗口创建,并交给c++ ogre创建渲染窗口时,在createRenderWindow时候出错。没办法,还是得用原来方式。
方法参考这里写链接内容
单纯按照这种方式,会在编译so时候出错,需要做的修改如下:
struct android_app* mApp;////
void OgreAndroidBaseFrame::callVoidFuc( const char* fucName )
{
JavaVM* jvm=mApp->activity->vm;
JNIEnv *env;
if(jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
{
///LOGE("%s: AttachCurrentThread() failed", __FUNCTION__);
LOGE("AttachCurrentThread() failed");
return ;
}
else
{
LOGE(" AttachCurrentThread() success");
}
//////////////////////
jclass cls;
jmethodID mid;
jobject activityInstance = mApp->activity->clazz;
cls = env->GetObjectClass(activityInstance);
if(cls == 0)
{
LOGI("---------获取类失败------------");
return;
}
mid = env->GetMethodID(cls,fucName,"()V");
if(mid == 0)
{
LOGI("---------获取LoadWebSite方法失败------------");
return;
}
env->CallVoidMethod(activityInstance,mid);
/////////////////////////
//(*env)->ReleaseStringUTFChars(env,url,(*env)->GetStringUTFChars(env, url, 0));
if(jvm->DetachCurrentThread() != JNI_OK)
{
LOGE("%s: DetachCurrentThread() failed");
}
}