从Android端利用jni调用C++代码
AndroidMain
找到Android端运行的Java文件
可以发现只有loadlibrary相关,所以在载入library后应该会自动执行一系列的初始化执行动作
static
{
System.loadLibrary( "svrapi" );
System.loadLibrary( "simple" );
}
所有Java文件里真正调用的是com_qualcomm_svrapi_SvrApi.cpp这个文件里的导出的一些函数
在srvApi 里面也有一个private/java的文件夹,里面包含的则是一系列的Java封装方法。SvrServiceClient.java方法添加各种Android服务,SvrApi.java的声明
public static SvrApi handler = new SvrApi();
上面一句创建了SrvApi对象,即SvrApi.java 自身包含的类,handle传给startVsync( Activity act )和stopVsync( Activity act )进行使用用于垂直同步。
SvrAndroidMain.cpp
void android_main(android_app *pAppState){
...
Svr::SvrApplication* pApp = Svr::CreateApplication();//创建Application
//添加各种Callback
SvrApplicationContext& appContext = pApp->GetApplicationContext();
pApp->LoadConfiguration();
while (1)
{
... // Loop until all events are read
if(!gIsPaused)
{
if( gRecreateContext )
{
createContext(pAppState);
}
if (gContextCreated)
{
if( (gNeedsReInitialization == true) || (gSvrInitialized == false) )
{
{
StartVR(pApp);//开始VR,里面调用了 pApp->Initialize();
//svrSetTrackingMode(appContext.trackingMode);
//等对设备进行初始化的操作,最后svrBeginVr(&beginParams);
//并把gSvrInitialized = true; gNeedsReInitialization = false;
}
}
SvrApplicationContext& appContext = pApp->GetApplicationContext();
if (gSvrInitialized)
{
pApp->Update();
pApp->Render();//更新渲染状态
}
EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
eglSwapBuffers(appContext.display, surface);//相当于将图像Present到屏幕上
appContext.frameCount++;//帧数添加
}
}
}
}
这个方法是程序启动后的入口。