Files
LayaNative2.0/Conch/source/conch/JNIFun.cpp
T
2020-11-11 16:17:13 +08:00

625 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
@file JNIFun.cpp
@brief
@author James
@version 1.0
@date 2016_5_19
*/
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef ANDROID
#include <sys/syscall.h>
#define gettidv1() syscall(__NR_gettid)
#define gettidv2() syscall(SYS_gettid)
#endif
#include <downloadCache/JCAndroidFileSource.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include <android/bitmap.h>
#include <downloadMgr/JCDownloadMgr.h>
#include <util/Log.h>
#include "JCConch.h"
//#include "JSWrapper/LayaWrap/JSMarket.h"
#include "CToJavaBridge.h"
#include "Audio/JCAudioManager.h"
#include "JSWrapper/LayaWrap/JSInput.h"
#include "util/JCZipFile.h"
#include "JCSystemConfig.h"
#include "JSWrapper/LayaWrap/JSGlobalExportCFun.h"
#include "JCConchRender.h"
#include "JCScriptRuntime.h"
#include "JSWrapper/LayaWrap/Video/JSVideo.h"
#include <imageLib/JCImageRW.h>
using namespace laya;
extern int g_nInnerWidth;
extern int g_nInnerHeight;
extern bool g_bGLCanvasSizeChanged;
extern std::string gRedistPath;
//------------------------------------------------------------------------------
bool g_bEngineInited = false;
std::mutex g_kReadyLock;
laya::JCConch* g_pConch = NULL;
extern AAssetManager* g_pAssetManager;
extern std::string gAssetRootPath;
extern std::string gAPKExpansionMainPath;
extern std::string gAPKExpansionPatchPath;
bool g_bInBKGround=false;
int64_t g_nInitTime = 0;
//------------------------------------------------------------------------------
extern "C"
{
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_configSetParamExt(JNIEnv * env, jobject obj,jstring p_strParamExt);//extparam
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_configSetURL(JNIEnv * env, jobject obj,jstring p_strUrl);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_configSetIsPlug(JNIEnv * env, jobject obj, jboolean p_bIsPlug);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_InitDLib(JNIEnv * env, jobject obj,jobject assetManager,jint nDownloadThreadNum,jstring p_strAssetRootPath,jstring p_strCachePath, jstring p_strAPKExpansionMainPath, jstring p_strAPKExpansionPatchPath,int threadMode,int debugMode,int debugPort);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_SetLocalStoragePath(JNIEnv * env, jobject obj,jstring p_strLocalStorage );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleTouch(JNIEnv * env, jobject obj,jint type,jint id,jint x,jint y );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleKeyEvent(JNIEnv * env, jobject obj,jint keyCode,jint actionType);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleJoystickEvent(JNIEnv * env, jobject obj,float THUMBL_xOffset,float THUMBL_yOffset,float THUMBR_xOffset,float THUMBR_yOffset,float LT_Offset,float RT_Offset);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleDeviceMotionEvent(JNIEnv * env, jobject obj, float ax, float ay, float az, float agx, float agy, float agz, float ra, float rb, float rg, float interval);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleDeviceOrientationEvent(JNIEnv * env, jobject obj, float ra, float rb, float rg);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_ReleaseDLib(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnAppDestroy(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnAppPause(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnGLReady(JNIEnv * env, jobject obj, int width,int height );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnAppResume(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onDrawFrame(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onVSyncCallback(JNIEnv * env, jobject obj, jlong vsynctm);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_exportStaticMethodToC(JNIEnv * env, jobject obj, jstring packcls);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_closeExternalWebView(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_alertCallback(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onSensorChanged(JNIEnv * env, jobject obj,float arc );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_reloadJS(JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onRunCmd(JNIEnv* env, jobject obj, jint cmd, jint nParam1, jint nParam2 );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_RunJS(JNIEnv* env, jobject obj, jstring jsstr );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_postMsgToRuntime(JNIEnv* env, jobject obj, jstring msg, jstring params);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onBuyPropsCallback( JNIEnv * env, jobject obj,jstring p_sDesc );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onInviteCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_exitToPlatform( JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_audioMusicPlayEnd( JNIEnv * env, jobject obj );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_networkChanged(JNIEnv* env, jobject obj, jint nNetworkType );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_loginCallback(JNIEnv* env, jobject obj, jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_authorizeCallback(JNIEnv* env, jobject obj, jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_refreshTokenCallback(JNIEnv* env, jobject obj, jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_rechargeEvent(JNIEnv* env, jobject obj, jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_inputChange(JNIEnv* env, jobject obj, jint keycode );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onShareAndFeed( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onGetGameFriends( JNIEnv * env, jobject obj,jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onSendToDesktop( JNIEnv * env, jobject obj,jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onLogout( JNIEnv * env, jobject obj,jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onMarketInit( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onTopicCircle( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onSwitchUserCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onEnterPlatformCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onEnterBBSCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onEnterFeedbackCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onEnterAccountMgrCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onSetRechargeInfoCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onSendMessageToPlatformCallback( JNIEnv * env, jobject obj,jstring p_sJsonParam );
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onGetUserInfoCallback(JNIEnv * env, jobject obj, jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onGetAvailableLoginTypeCallback(JNIEnv * env, jobject obj, jstring p_sJsonParam);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_setLocalizable(JNIEnv * env, jobject obj, jboolean p_bIsLocalPackage);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_callConchJSFunction(JNIEnv* env, jobject obj, jstring sFunctionName,jstring sJsonParam,jstring sCallbackFunction);
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_captureScreenCallBack(JNIEnv* env, jobject obj, jint w, jint h, jbyteArray byteArray);
JNIEXPORT jboolean JNICALL Java_layaair_game_browser_ConchJNI_onBackPressed(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_layaair_game_browser_LayaVideoPlayer_emit(JNIEnv* env, jobject obj, jlong ptr, jstring str);
JNIEXPORT void JNICALL Java_layaair_game_browser_LayaVideoPlayer_transferBitmap(JNIEnv* env, jobject obj, jobject bitmap, jlong dataPtr);
};
void postCmdToMainThread(int p_nCmd, int p_nParam1, int p_nParam2)
{
CToJavaBridge::JavaRet ret;
char buffer[60];
sprintf(buffer, "[%d,%d,%d]",p_nCmd,p_nParam1,p_nParam2);
std::string params(buffer);
CToJavaBridge::GetInstance()->callMethod(-1, true, CToJavaBridge::JavaClass.c_str(), "postCmdToMain", params.c_str(), ret);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_configSetURL(JNIEnv * env, jobject obj,jstring p_strUrl)
{
char* pstrUrl =(char*) env->GetStringUTFChars( p_strUrl, NULL );
g_kSystemConfig.m_strStartURL = pstrUrl;
LOGI("JNI seturl%s", pstrUrl);
env->ReleaseStringUTFChars(p_strUrl, pstrUrl);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_configSetIsPlug(JNIEnv * env, jobject obj, jboolean p_bIsPlug)
{
JCSystemConfig::s_bIsPlug = p_bIsPlug;
LOGI("JNI setIsPlug%d", p_bIsPlug);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_configSetParamExt(JNIEnv * env, jobject obj,jstring p_strParamExt)
{
char* pstrParamExt =(char*) env->GetStringUTFChars( p_strParamExt, NULL );
g_kSystemConfig.m_jsonparamExt = pstrParamExt;
LOGI("JNI setParamExt%s", pstrParamExt);
env->ReleaseStringUTFChars(p_strParamExt, pstrParamExt);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_InitDLib(JNIEnv * env, jobject obj,jobject assetManager,int nThreadNum,jstring p_strAssetRootPath, jstring p_strCachePath , jstring p_strAPKExpansionMainPath, jstring p_strAPKExpansionPatchPath,int threadMode,int debugMode,int debugPort)
{
LOGI("JNI InitDLib");
if(g_pConch)
{
LOGI("JNI has an old conch object! delete it");
//如果上次不正常退出,如果时间太短,可能有的线程还在创建过程中。所以等待一会儿。
//例如g_pConch突然为null,可能有人还在用。
std::this_thread::sleep_for(std::chrono::milliseconds(500));
//必须走完整流程,例如有的线程还在创建,完了后就正常跑,然后这里g_pConch又被删了
Java_layaair_game_browser_ConchJNI_ReleaseDLib(env,obj);
LOGI("JNI del old end");
}
//这个不要放到开始,以影响面上面的异常处理
g_nInitTime=tmGetCurms();
char* pAssetRootPath =(char*) env->GetStringUTFChars( p_strAssetRootPath, NULL );
char* pCachePath = (char*)env->GetStringUTFChars( p_strCachePath, NULL);
char* pAPKExpansionMain =(char*) env->GetStringUTFChars( p_strAPKExpansionMainPath, NULL );
char* pAPKExpansionPatch = (char*)env->GetStringUTFChars( p_strAPKExpansionPatchPath, NULL);
LOGI( "JNI InitDownLoadManager CachePath=%s, assetroot=%s, APKExpansionMain=%s, APKExpansionPatch=%s ", pCachePath, pAssetRootPath, pAPKExpansionMain, pAPKExpansionPatch);
gRedistPath = pCachePath;
gRedistPath +="/";
gAssetRootPath = pAssetRootPath;
gAPKExpansionMainPath= pAPKExpansionMain;
gAPKExpansionPatchPath = pAPKExpansionPatch;
if( assetManager==0 || !(g_pAssetManager = AAssetManager_fromJava(env,assetManager)))
{
LOGI("JNI Warning! AssetManager =NULL!! 下面要采用jar流程了。");
JCZipFile* pZip = new laya::JCZipFile();
if( strstr(pAssetRootPath,".jar" ) ||strstr(pAssetRootPath,".JAR" )||strstr(pAssetRootPath,".zip" )||strstr(pAssetRootPath,".apk")||strstr(pAssetRootPath,".APK") ){
if(pZip->open(pAssetRootPath))
{
LOGI("JNI 打开jar成功。");
pZip->InitDir("assets");
}
JCConch::s_pAssetsFiles = pZip;
}
else
{
LOGI("JNI 没有设置assetMgr,也没有传入jar包。");
}
}
else
{
laya::JCAndroidFileSource* pAssets = new laya::JCAndroidFileSource();
pAssets->Init(g_pAssetManager, "","", "", "");
JCConch::s_pAssetsFiles = pAssets;
}
env->ReleaseStringUTFChars(p_strAssetRootPath, pAssetRootPath);
env->ReleaseStringUTFChars(p_strCachePath, pCachePath);
env->ReleaseStringUTFChars(p_strAPKExpansionMainPath, pAPKExpansionMain);
env->ReleaseStringUTFChars(p_strAPKExpansionPatchPath, pAPKExpansionPatch);
THREAD_MODE nMode = (THREAD_MODE)(threadMode);
if (nMode == THREAD_MODE_SINGLE)
{
g_kSystemConfig.m_nThreadMODE = nMode;
LOGI(">>>>>>Thread Mode = single");
}
else if (nMode == THREAD_MODE_DOUBLE)
{
g_kSystemConfig.m_nThreadMODE = nMode;
LOGI(">>>>>>Thread Mode = double");
}
else
{
LOGI(">>>>>>Thread Mode = %d", g_kSystemConfig.m_nThreadMODE);
}
g_pConch = new laya::JCConch(nThreadNum,(laya::JS_DEBUG_MODE)debugMode,debugPort);
g_pConch->m_funcPostMsgToMainThread = std::bind(postCmdToMainThread, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_SetLocalStoragePath(JNIEnv * env, jobject obj,jstring p_strLocalStorage )
{
char* pLocalStoragePath =(char*) env->GetStringUTFChars( p_strLocalStorage, NULL );
LOGI( "JNI localStoragePath=%s", pLocalStoragePath);
env->ReleaseStringUTFChars(p_strLocalStorage, pLocalStoragePath);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleTouch( JNIEnv * env, jobject obj,jint type,jint id,jint x,jint y )
{
enum java_motion_Action
{
ACTION_DOWN=0,
ACTION_UP=1,
ACTION_MOVE=2,
ACTION_POINTER_DOWN=5,
ACTION_POINTER_UP=6,
};
switch(type)
{
case java_motion_Action::ACTION_DOWN:
{
inputEvent e;
e.nType =E_ONTOUCHSTART;
e.nTouchType = type;
e.posX = x;
e.posY = y;
e.id = id;
strncpy(e.type, "touchstart", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
break;
}
case java_motion_Action::ACTION_UP:
{
inputEvent e;
e.nType = E_ONTOUCHEND;
e.nTouchType = type;
e.posX = x;
e.posY = y;
e.id = id;
strncpy(e.type, "touchend", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
break;
}
case java_motion_Action::ACTION_MOVE:
{
inputEvent e;
e.nType = E_ONTOUCHMOVE;
e.nTouchType = type;
e.posX = x;
e.posY = y;
e.id = id;
strncpy(e.type, "touchmove", 256);
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
break;
}
case java_motion_Action::ACTION_POINTER_DOWN:
{
inputEvent e;
e.nType = E_ONACTION_POINTER_DOWN;
e.nTouchType = type;
e.posX = x;
e.posY = y;
e.id = id;
strncpy(e.type, "touchstart", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
break;
}
case java_motion_Action::ACTION_POINTER_UP:
{
inputEvent e;
e.nType = E_ONACTION_POINTER_UP;
e.nTouchType = type;
e.posX = x;
e.posY = y;
e.id = id;
strncpy(e.type, "touchend", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
break;
}
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleKeyEvent(JNIEnv * env, jobject obj,jint keyCode,jint actionType)
{
enum android_key_Code
{
KEYCODE_BACK = 4,
KEYCODE_DPAD_UP = 19,
KEYCODE_DPAD_DOWN = 20,
KEYCODE_DPAD_LEFT = 21,
KEYCODE_DPAD_RIGHT = 22,
KEYCODE_DPAD_CENTER = 23,
KEYCODE_VOLUME_UP = 24,
KEYCODE_VOLUME_DOWN = 25,
KEYCODE_ENTER = 66,
KEYCODE_MENU = 82,
KEYCODE_BUTTON_A = 96,
KEYCODE_BUTTON_B = 97,
KEYCODE_BUTTON_X = 99,
KEYCODE_BUTTON_Y = 100,
KEYCODE_BUTTON_L1 = 102,
KEYCODE_BUTTON_R1 = 103,
KEYCODE_BUTTON_L2 = 104,
KEYCODE_BUTTON_R2 = 105,
KEYCODE_BUTTON_THUMBL = 106,
KEYCODE_BUTTON_THUMBR = 107,
KEYCODE_BUTTON_START = 108,
KEYCODE_BUTTON_SELECT = 109,
};
enum android_key_Action
{
ACTION_DOWN = 0,
ACTION_UP = 1,
};
if(actionType == android_key_Action::ACTION_DOWN)
{
inputEvent e;
e.nType = E_ONKEYDOWN;
e.keyCode = keyCode;
strncpy(e.type, "keydown", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
}
else if(actionType == android_key_Action::ACTION_UP)
{
inputEvent e;
e.nType =E_ONKEYUP;
e.keyCode = keyCode;
strncpy(e.type, "keyup", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleJoystickEvent( JNIEnv * env, jobject obj,float THUMBL_xOffset,float THUMBL_yOffset,float THUMBR_xOffset,float THUMBR_yOffset,float LT_Offset,float RT_Offset )
{
inputEvent e;
e.nType = E_JOYSTICK;
e.fTHUMBL_xOffset = THUMBL_xOffset;
e.fTHUMBL_yOffset = THUMBL_yOffset;
e.fTHUMBR_xOffset = THUMBR_xOffset;
e.fTHUMBR_yOffset = THUMBR_yOffset;
e.fLT_Offset = LT_Offset;
e.fRT_Offset = RT_Offset;
strncpy(e.type, "onjoystick", 256 );
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleDeviceMotionEvent(JNIEnv * env, jobject obj, float ax, float ay, float az, float agx, float agy, float agz, float ra, float rb, float rg, float interval)
{
DeviceMotionEvent e;
e.nType = E_DEVICEMOTION;
e.ax = ax;
e.ay = ay;
e.az = az;
e.agx = agx;
e.agy = agy;
e.agz = agz;
e.ra = ra;
e.rb = rb;
e.rg = rg;
e.interval = interval;
strncpy(e.type, "devicemotion", 256);
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_handleDeviceOrientationEvent(JNIEnv * env, jobject obj, float ra, float rb, float rg)
{
DeviceOrientationEvent e;
e.nType = E_DEVICEORIENTATION;
e.ra = ra;
e.rb = rb;
e.rg = rg;
strncpy(e.type, "deviceorientation", 256);
JCScriptRuntime::s_JSRT->dispatchInputEvent(e);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_ReleaseDLib(JNIEnv * env, jobject obj )
{
LOGI("JNI del engine");
JCAudioManager::GetInstance()->stopMp3();
if(g_pConch)
{
if(tmGetCurms()- g_nInitTime<2000)
{
LOGI("JNI exit need a little wait");
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
if (g_bInBKGround)
{
LOGI("JNI App in background!");
JCConch::s_pConchRender->willExit();
}
g_pConch->onAppDestory();
if (g_kSystemConfig.m_nThreadMODE==THREAD_MODE_SINGLE)
{
JCScriptRuntime::s_JSRT->stop();
}
delete g_pConch;
g_pConch=NULL;
}
g_bEngineInited = false;
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnAppDestroy(JNIEnv * env, jobject obj )
{
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnAppPause(JNIEnv * env, jobject obj )
{
LOGI("JNI OnAppPause");
g_bInBKGround = true;
if( laya::JCAudioManager::GetInstance()->getMp3Mute() == false && laya::JCAudioManager::GetInstance()->getMp3Stopped() == false)
{
JCAudioManager::GetInstance()->pauseMp3();
}
laya::JCAudioManager::GetInstance()->m_pWavPlayer->pause();
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnAppResume(JNIEnv * env, jobject obj )
{
LOGI("JNI OnAppResume");
if (!g_pConch)
return;
g_bInBKGround=false;
//继续声音
if( laya::JCAudioManager::GetInstance()->getMp3Mute() == false && laya::JCAudioManager::GetInstance()->getMp3Stopped() == false)
{
laya::JCAudioManager::GetInstance()->resumeMp3();
}
laya::JCAudioManager::GetInstance()->m_pWavPlayer->resume();
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_OnGLReady(JNIEnv * env, jobject obj, int width,int height )
{
LOGI("JNI onGLReady tid=%ld", gettidv1());
auto pRender = JCConch::s_pConchRender;
if( g_nInnerWidth!=width || g_nInnerHeight != height )
{
LOGI("JNI surface innersize changed : g_nInnerWidth=%d,g_nInnerHeight=%d",width,height);
g_nInnerWidth = width;
g_nInnerHeight = height;
g_bGLCanvasSizeChanged=true;
}
LOGI("JNI init dev w=%d,h=%d",width,height);
//pRender->onGLDeviceLosted();
pRender->onGLReady();
g_kReadyLock.lock();
if( !g_bEngineInited )
{
//启动js线程
g_pConch->onAppStart();
g_bEngineInited = true;
if (g_kSystemConfig.m_nThreadMODE==THREAD_MODE_SINGLE)
{
JCScriptRuntime::s_JSRT->start(JCConch::s_pConch->m_strStartJS.c_str());
}
}
g_kReadyLock.unlock();
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onDrawFrame(JNIEnv * env, jobject obj )
{
auto pRender = JCConch::s_pConchRender;
if (pRender)
{
pRender->renderFrame(0,false);
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onVSyncCallback(JNIEnv * env, jobject obj, jlong VSynctm) {
double vsynctm = VSynctm / 1e6;
//auto ctm = laya::tmGetCurms();
//LOGE("---TM:%f,d=%f,cur=%f,d=%f", (float)vsynctm, (float)(vsynctm - lastVSYNC1) , ctm,(ctm-vsynctm));
if (JCScriptRuntime::s_JSRT) {
JCScriptRuntime::s_JSRT->onVSyncEvent(vsynctm);
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_closeExternalWebView(JNIEnv * env, jobject obj )
{
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_alertCallback(JNIEnv * env, jobject obj )
{
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_exportStaticMethodToC(JNIEnv * env, jobject obj, jstring packcls)
{
const char* rawPackCls = env->GetStringUTFChars(packcls, NULL);
CToJavaBridge::GetInstance()->addStaticMethod(env,rawPackCls);
env->ReleaseStringUTFChars(packcls, rawPackCls);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onSensorChanged(JNIEnv * env, jobject obj,float arc )
{
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_reloadJS(JNIEnv * env, jobject obj )
{
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_onRunCmd(JNIEnv* env, jobject obj, jint cmd, jint nParam1, jint nParam2 )
{
if(g_pConch )
{
g_pConch->onRunCmdInMainThread( cmd, nParam1, nParam2 );
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_RunJS(JNIEnv* env, jobject obj, jstring jsstr )
{
if (g_pConch && JCScriptRuntime::s_JSRT && jsstr)
{
const char* rawString = env->GetStringUTFChars(jsstr, NULL);
JCScriptRuntime::s_JSRT->callJSString(rawString);
env->ReleaseStringUTFChars(jsstr, rawString);
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_postMsgToRuntime(JNIEnv* env, jobject obj, jstring msg, jstring params)
{
const char* rawMsg = env->GetStringUTFChars(msg, NULL);
const char* rawParams = env->GetStringUTFChars(params, NULL);
env->ReleaseStringUTFChars(msg, rawMsg);
env->ReleaseStringUTFChars(params, rawParams);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_exitToPlatform( JNIEnv * env, jobject obj )
{
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_audioMusicPlayEnd( JNIEnv * env, jobject obj )
{
laya::JCMp3Interface* pMp3Player = laya::JCAudioManager::GetInstance()->m_pMp3Player;
if( pMp3Player )
{
pMp3Player->onPlayEnd();
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_networkChanged(JNIEnv* env, jobject obj, jint nNetworkType )
{
JCScriptRuntime::s_JSRT->onNetworkChanged(nNetworkType);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_inputChange(JNIEnv* env, jobject obj, jint keycode)
{
if (JCScriptRuntime::s_JSRT->m_pCurEditBox)
{
JCScriptRuntime::s_JSRT->m_pCurEditBox->onInput();
}
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_setLocalizable(JNIEnv * env, jobject obj, jboolean p_bIsLocalPackage)
{
JCSystemConfig::s_bLocalizable = p_bIsLocalPackage;
LOGI("setLocalizable%d", p_bIsLocalPackage);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_callConchJSFunction(JNIEnv* env, jobject obj, jstring p_sFunctionName,jstring p_sJsonParam,jstring p_sCallbackFunction)
{
const char* sFunctionName = env->GetStringUTFChars(p_sFunctionName, NULL);
const char* sJsonParam = env->GetStringUTFChars(p_sJsonParam, NULL);
const char* sCallbackFunction = env->GetStringUTFChars(p_sCallbackFunction, NULL);
LOGI(">>>>>>>>Java_layaair_game_browser_ConchJNI_callConchJSFunction functionName=%s, jsonParam=%s, callbackFuncton=%s",sFunctionName, sJsonParam,sCallbackFunction );
JCScriptRuntime::s_JSRT->callJC( sFunctionName,sJsonParam,sCallbackFunction );
env->ReleaseStringUTFChars(p_sFunctionName, sFunctionName);
env->ReleaseStringUTFChars(p_sJsonParam, sJsonParam);
env->ReleaseStringUTFChars(p_sCallbackFunction, sCallbackFunction);
}
//------------------------------------------------------------------------------
JNIEXPORT void JNICALL Java_layaair_game_browser_ConchJNI_captureScreenCallBack(JNIEnv* env, jobject obj, jint w, jint h, jbyteArray byteArray) {
jint len = env->GetArrayLength(byteArray);
jbyte* ba = env->GetByteArrayElements(byteArray, JNI_FALSE);
char* result = new char[len];
memcpy(result, ba, len);
JSInput::getInstance()->captureScreenCallBack(result,len, w, h);
env->ReleaseByteArrayElements(byteArray, ba, 0);
}
//------------------------------------------------------------------------------
JNIEXPORT jboolean JNICALL Java_layaair_game_browser_ConchJNI_onBackPressed(JNIEnv* env, jobject obj)
{
LOGI(">>>>>>>>Java_layaair_game_browser_ConchJNI_onBackPressed");
bool ret = JCScriptRuntime::s_JSRT->onBackPressed();
return jboolean(ret);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_LayaVideoPlayer_emit(JNIEnv* env, jobject obj, jlong ptr, jstring str)
{
JSVideo* pVideo = reinterpret_cast<JSVideo*>(ptr);
if(!pVideo)
return;
const char* evtName = env->GetStringUTFChars(str, NULL);
// LOGI("[DEBUG][Video]Call emit function %s", evtName);
pVideo->CallHandle(evtName);
env->ReleaseStringUTFChars(str, evtName);
}
JNIEXPORT void JNICALL Java_layaair_game_browser_LayaVideoPlayer_transferBitmap(JNIEnv* env, jobject obj, jobject bitmap, jlong dataPtr)
{
AndroidBitmapInfo bmpInfo={0};
if(AndroidBitmap_getInfo(env, bitmap, &bmpInfo) < 0)
{
// LOGE("[Debug][Video]bitmap: Error getInfo");
return;
}
char** dataFromBmp=NULL;
if(AndroidBitmap_lockPixels(env,bitmap,(void**)&dataFromBmp))
{
// LOGE("[Debug][Video]bitmap: Error lockPixels ");
return;
}
// LOGI("[Debug][Video]Call native transferBitmap %ld", dataPtr);
BitmapData* pBitmapData = reinterpret_cast<BitmapData*>(dataPtr);
if(!pBitmapData)
{
// LOGE("[Debug][Video]Error pBitmapData");
AndroidBitmap_unlockPixels(env,bitmap);
return;
}
pBitmapData->reconfigure(bmpInfo.width, bmpInfo.height, 32, ImgType_unknow);
memcpy(pBitmapData->m_pImageData, dataFromBmp, sizeof(int32_t) * pBitmapData->m_nWidth * pBitmapData->m_nHeight);
AndroidBitmap_unlockPixels(env,bitmap);
}
//-----------------------------END FILE--------------------------------