2 * Copyright (C) 2015-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "JNIMainActivity.h"
11 #include "CompileInfo.h"
13 #include <androidjni/Activity.h>
14 #include <androidjni/Intent.h>
15 #include <androidjni/jutils-details.hpp>
19 CJNIMainActivity
* CJNIMainActivity::m_appInstance(NULL
);
21 CJNIMainActivity::CJNIMainActivity(const ANativeActivity
*nativeActivity
)
22 : CJNIActivity(nativeActivity
)
27 CJNIMainActivity::~CJNIMainActivity()
32 void CJNIMainActivity::RegisterNatives(JNIEnv
* env
)
34 std::string pkgRoot
= CCompileInfo::GetClass();
36 const std::string mainClass
= pkgRoot
+ "/Main";
37 const std::string settingsObserver
= pkgRoot
+ "/XBMCSettingsContentObserver";
38 const std::string inputDeviceListener
= pkgRoot
+ "/XBMCInputDeviceListener";
40 jclass cMain
= env
->FindClass(mainClass
.c_str());
43 JNINativeMethod methods
[] = {
44 {"_onNewIntent", "(Landroid/content/Intent;)V",
45 reinterpret_cast<void*>(&CJNIMainActivity::_onNewIntent
)},
46 {"_onActivityResult", "(IILandroid/content/Intent;)V",
47 reinterpret_cast<void*>(&CJNIMainActivity::_onActivityResult
)},
48 {"_doFrame", "(J)V", reinterpret_cast<void*>(&CJNIMainActivity::_doFrame
)},
49 {"_callNative", "(JJ)V", reinterpret_cast<void*>(&CJNIMainActivity::_callNative
)},
50 {"_onVisibleBehindCanceled", "()V",
51 reinterpret_cast<void*>(&CJNIMainActivity::_onVisibleBehindCanceled
)},
53 env
->RegisterNatives(cMain
, methods
, sizeof(methods
) / sizeof(methods
[0]));
56 jclass cSettingsObserver
= env
->FindClass(settingsObserver
.c_str());
57 if (cSettingsObserver
)
59 JNINativeMethod methods
[] = {
60 {"_onVolumeChanged", "(I)V", reinterpret_cast<void*>(&CJNIMainActivity::_onVolumeChanged
)},
62 env
->RegisterNatives(cSettingsObserver
, methods
, sizeof(methods
) / sizeof(methods
[0]));
65 jclass cInputDeviceListener
= env
->FindClass(inputDeviceListener
.c_str());
66 if (cInputDeviceListener
)
68 JNINativeMethod methods
[] = {
69 {"_onInputDeviceAdded", "(I)V",
70 reinterpret_cast<void*>(&CJNIMainActivity::_onInputDeviceAdded
)},
71 {"_onInputDeviceChanged", "(I)V",
72 reinterpret_cast<void*>(&CJNIMainActivity::_onInputDeviceChanged
)},
73 {"_onInputDeviceRemoved", "(I)V",
74 reinterpret_cast<void*>(&CJNIMainActivity::_onInputDeviceRemoved
)}};
75 env
->RegisterNatives(cInputDeviceListener
, methods
, sizeof(methods
) / sizeof(methods
[0]));
79 void CJNIMainActivity::_onNewIntent(JNIEnv
*env
, jobject context
, jobject intent
)
84 m_appInstance
->onNewIntent(CJNIIntent(jhobject::fromJNI(intent
)));
87 void CJNIMainActivity::_onActivityResult(JNIEnv
*env
, jobject context
, jint requestCode
, jint resultCode
, jobject resultData
)
92 m_appInstance
->onActivityResult(requestCode
, resultCode
, CJNIIntent(jhobject::fromJNI(resultData
)));
95 void CJNIMainActivity::_callNative(JNIEnv
*env
, jobject context
, jlong funcAddr
, jlong variantAddr
)
99 ((void (*)(CVariant
*))funcAddr
)((CVariant
*)variantAddr
);
102 void CJNIMainActivity::_onVisibleBehindCanceled(JNIEnv
* env
, jobject context
)
107 m_appInstance
->onVisibleBehindCanceled();
110 void CJNIMainActivity::runNativeOnUiThread(void (*callback
)(void*), void* variant
)
112 call_method
<void>(m_context
,
113 "runNativeOnUiThread", "(JJ)V", (jlong
)callback
, (jlong
)variant
);
116 void CJNIMainActivity::_onVolumeChanged(JNIEnv
*env
, jobject context
, jint volume
)
121 m_appInstance
->onVolumeChanged(volume
);
124 void CJNIMainActivity::_onInputDeviceAdded(JNIEnv
*env
, jobject context
, jint deviceId
)
126 static_cast<void>(env
);
127 static_cast<void>(context
);
129 if (m_appInstance
!= nullptr)
130 m_appInstance
->onInputDeviceAdded(deviceId
);
133 void CJNIMainActivity::_onInputDeviceChanged(JNIEnv
*env
, jobject context
, jint deviceId
)
135 static_cast<void>(env
);
136 static_cast<void>(context
);
138 if (m_appInstance
!= nullptr)
139 m_appInstance
->onInputDeviceChanged(deviceId
);
142 void CJNIMainActivity::_onInputDeviceRemoved(JNIEnv
*env
, jobject context
, jint deviceId
)
144 static_cast<void>(env
);
145 static_cast<void>(context
);
147 if (m_appInstance
!= nullptr)
148 m_appInstance
->onInputDeviceRemoved(deviceId
);
151 void CJNIMainActivity::_doFrame(JNIEnv
*env
, jobject context
, jlong frameTimeNanos
)
156 m_appInstance
->doFrame(frameTimeNanos
);
159 CJNIRect
CJNIMainActivity::getDisplayRect()
161 return call_method
<jhobject
>(m_context
,
162 "getDisplayRect", "()Landroid/graphics/Rect;");
165 void CJNIMainActivity::registerMediaButtonEventReceiver()
167 call_method
<void>(m_context
,
168 "registerMediaButtonEventReceiver", "()V");
171 void CJNIMainActivity::unregisterMediaButtonEventReceiver()
173 call_method
<void>(m_context
,
174 "unregisterMediaButtonEventReceiver", "()V");