2 * Copyright (C) 2012-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.
12 #include "platform/android/activity/JNIMainActivity.h"
13 #include "platform/android/activity/JNIXBMCAudioManagerOnAudioFocusChangeListener.h"
14 #include "platform/android/activity/JNIXBMCBroadcastReceiver.h"
15 #include "platform/android/activity/JNIXBMCConnectivityManagerNetworkCallback.h"
16 #include "platform/android/activity/JNIXBMCDisplayManagerDisplayListener.h"
17 #include "platform/android/activity/JNIXBMCFile.h"
18 #include "platform/android/activity/JNIXBMCJsonHandler.h"
19 #include "platform/android/activity/JNIXBMCMainView.h"
20 #include "platform/android/activity/JNIXBMCMediaSession.h"
21 #include "platform/android/activity/JNIXBMCNsdManagerDiscoveryListener.h"
22 #include "platform/android/activity/JNIXBMCNsdManagerRegistrationListener.h"
23 #include "platform/android/activity/JNIXBMCNsdManagerResolveListener.h"
24 #include "platform/android/activity/JNIXBMCSpeechRecognitionListener.h"
25 #include "platform/android/activity/JNIXBMCSurfaceTextureOnFrameAvailableListener.h"
26 #include "platform/android/activity/JNIXBMCTextureCache.h"
27 #include "platform/android/activity/JNIXBMCURIUtils.h"
28 #include "platform/android/activity/JNIXBMCVideoView.h"
43 // redirect stdout / stderr to logcat
44 // based on https://codelab.wordpress.com/2014/11/03/how-to-use-standard-output-streams-for-logging-in-android-apps/
49 // make stdout line-buffered and stderr unbuffered
50 setvbuf(stdout
, 0, _IOLBF
, 0);
51 setvbuf(stderr
, 0, _IONBF
, 0);
53 // spawn the logging thread
54 std::thread
thread(&LogRedirector::Run
);
61 // create a pipe and redirect stdout and stderr
64 dup2(pfds
[1], STDOUT_FILENO
);
65 dup2(pfds
[1], STDERR_FILENO
);
69 while ((rdsz
= read(pfds
[0], buf
, sizeof(buf
) - 1)) > 0)
71 if (buf
[rdsz
- 1] == '\n')
74 buf
[rdsz
] = 0; // add null-terminator
75 __android_log_write(ANDROID_LOG_DEBUG
, "Kodi", buf
);
80 LogRedirector g_LogRedirector
;
84 extern void android_main(struct android_app
* state
)
87 CEventLoop
eventLoop(state
);
88 IInputHandler inputHandler
;
89 CXBMCApp
& theApp
= CXBMCApp::Create(state
->activity
, inputHandler
);
92 eventLoop
.run(theApp
, inputHandler
);
96 CXBMCApp::android_printf("android_main: setup failed");
98 CXBMCApp::android_printf("android_main: Exiting");
102 // We need to call exit() so that all loaded libraries are properly unloaded
103 // otherwise on the next start of the Activity android will simply re-use
104 // those loaded libs in the state they were in when we quit Kodi last time
105 // which will lead to crashes because of global/static classes that haven't
106 // been properly uninitialized
110 extern "C" JNIEXPORT jint
JNI_OnLoad(JavaVM
*vm
, void *reserved
)
112 jint version
= JNI_VERSION_1_6
;
114 if (vm
->GetEnv(reinterpret_cast<void**>(&env
), version
) != JNI_OK
)
117 CJNIMainActivity::RegisterNatives(env
);
118 CJNIXBMCAudioManagerOnAudioFocusChangeListener::RegisterNatives(env
);
119 CJNIXBMCBroadcastReceiver::RegisterNatives(env
);
120 CJNIXBMCConnectivityManagerNetworkCallback::RegisterNatives(env
);
121 CJNIXBMCDisplayManagerDisplayListener::RegisterNatives(env
);
122 CJNIXBMCFile::RegisterNatives(env
);
123 CJNIXBMCJsonHandler::RegisterNatives(env
);
124 CJNIXBMCMainView::RegisterNatives(env
);
125 CJNIXBMCMediaSession::RegisterNatives(env
);
126 CJNIXBMCNsdManagerDiscoveryListener::RegisterNatives(env
);
127 CJNIXBMCNsdManagerRegistrationListener::RegisterNatives(env
);
128 CJNIXBMCNsdManagerResolveListener::RegisterNatives(env
);
129 CJNIXBMCSpeechRecognitionListener::RegisterNatives(env
);
130 CJNIXBMCSurfaceTextureOnFrameAvailableListener::RegisterNatives(env
);
131 CJNIXBMCTextureCache::RegisterNatives(env
);
132 CJNIXBMCURIUtils::RegisterNatives(env
);
133 CJNIXBMCVideoView::RegisterNatives(env
);