2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <sys/types.h>
23 #include <android/log.h>
24 #include <android_native_app_glue.h>
25 #include <dali-demo-native-activity-jni.h>
26 #include <dali/devel-api/adaptor-framework/application-devel.h>
27 #include <dali/integration-api/adaptor-framework/android/android-framework.h>
28 #include <dali/integration-api/debug.h>
31 // from android_native_app_glue.c
33 #define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "dalidemo", __VA_ARGS__))
35 #define LOGV(...) ((void)0)
40 void free_saved_state(struct android_app* android_app)
42 LOGV("free_saved_state");
43 pthread_mutex_lock(&android_app->mutex);
45 if(android_app->savedState != NULL)
47 free(android_app->savedState);
48 android_app->savedState = NULL;
49 android_app->savedStateSize = 0;
52 pthread_mutex_unlock(&android_app->mutex);
55 void android_app_destroy(struct android_app* android_app)
57 LOGV("android_app_destroy");
58 free_saved_state(android_app);
59 pthread_mutex_lock(&android_app->mutex);
61 if(android_app->inputQueue != NULL)
63 AInputQueue_detachLooper(android_app->inputQueue);
66 AConfiguration_delete(android_app->config);
67 android_app->destroyed = 1;
69 pthread_cond_broadcast(&android_app->cond);
70 pthread_mutex_unlock(&android_app->mutex);
72 // Can't touch android_app object after this.
77 void ExtractAsset(struct android_app* state, const std::string& assetPath, const std::string& filePath)
79 AAsset* asset = AAssetManager_open(state->activity->assetManager, assetPath.c_str(), AASSET_MODE_BUFFER);
82 size_t length = AAsset_getLength(asset) + 1;
84 char* buffer = new char[length];
85 length = AAsset_read(asset, buffer, length);
87 FILE* file = fopen(filePath.c_str(), "wb");
90 fwrite(buffer, 1, length, file);
99 void ExtractAssets(struct android_app* state, const std::string& assetDirPath, const std::string& filesDirPath)
101 AAssetDir* assetDir = AAssetManager_openDir(state->activity->assetManager, assetDirPath.c_str());
104 if(mkdir(filesDirPath.c_str(), S_IRWXU) != -1)
106 const char* filename = NULL;
107 std::string assetPath = assetDirPath + "/";
108 while((filename = AAssetDir_getNextFileName(assetDir)) != NULL)
110 ExtractAsset(state, assetPath + filename, filesDirPath + "/" + filename);
114 AAssetDir_close(assetDir);
118 void ExtractFontConfig(struct android_app* state, std::string assetFontConfig, std::string fontsPath)
120 AAsset* asset = AAssetManager_open(state->activity->assetManager, assetFontConfig.c_str(), AASSET_MODE_BUFFER);
123 size_t length = AAsset_getLength(asset) + 1;
125 char* buffer = new char[length];
126 length = AAsset_read(asset, buffer, length);
128 std::string fontConfig = std::string(buffer, length);
129 int i = fontConfig.find("~");
130 if(i != std::string::npos)
132 std::string filesDir = state->activity->internalDataPath;
133 fontConfig.replace(i, 1, filesDir);
136 std::string fontsFontConfig = fontsPath;
137 FILE* file = fopen(fontsFontConfig.c_str(), "wb");
140 fwrite(fontConfig.c_str(), 1, fontConfig.size(), file);
149 extern "C" void FcConfigPathInit(const char* path, const char* file);
151 void android_main(struct android_app* state)
153 LOGV("android_main() >>");
155 std::string filesDir = state->activity->internalDataPath;
157 std::string fontconfigPath = filesDir + "/fonts";
158 setenv("FONTCONFIG_PATH", fontconfigPath.c_str(), 1);
160 std::string fontconfigFile = fontconfigPath + "/fonts.conf";
161 setenv("FONTCONFIG_FILE", fontconfigFile.c_str(), 1);
163 struct stat st = {0};
164 FcConfigPathInit(fontconfigPath.c_str(), fontconfigFile.c_str());
166 if(stat(fontconfigPath.c_str(), &st) == -1)
168 mkdir(fontconfigPath.c_str(), S_IRWXU);
169 ExtractFontConfig(state, "fonts/fonts.conf", fontconfigPath + "/fonts.conf");
170 ExtractFontConfig(state, "fonts/fonts.dtd", fontconfigPath + "/fonts.dtd");
171 ExtractFontConfig(state, "fonts/local.conf", fontconfigPath + "/local.conf");
172 ExtractAssets(state, "fonts/dejavu", fontconfigPath + "/dejavu");
173 ExtractAssets(state, "fonts/tizen", fontconfigPath + "/tizen");
174 ExtractAssets(state, "fonts/bitmap", fontconfigPath + "/bitmap");
177 Dali::Integration::AndroidFramework::New();
178 Dali::Integration::AndroidFramework::Get().SetNativeApplication(state);
179 Dali::Integration::AndroidFramework::Get().SetApplicationConfiguration(state->config);
180 Dali::Integration::AndroidFramework::Get().SetApplicationAssets(state->activity->assetManager);
181 Dali::Integration::AndroidFramework::Get().SetInternalDataPath(filesDir);
183 DaliDemoNativeActivity nativeActivity(state->activity);
186 std::string libpath = "/data/data/com.sec.dalidemo/lib/libdali-demo.so";
187 std::string callParam = nativeActivity.GetIntentStringExtra("start");
188 if(callParam.empty())
190 callParam = nativeActivity.GetMetaData("start");
193 if(!callParam.empty())
195 libpath = "/data/data/com.sec.dalidemo/lib/lib" + callParam + ".so";
198 void* handle = dlopen(libpath.c_str(), RTLD_LAZY);
204 dlerror(); /* Clear any existing error */
206 int (*main)(int, char**) = (int (*)(int, char**))dlsym(handle, "main");
209 status = main(0, nullptr);
218 android_app_destroy(state);
220 Dali::Integration::AndroidFramework::Get().SetNativeApplication(nullptr);
221 Dali::Integration::AndroidFramework::Get().SetApplicationConfiguration(nullptr);
222 Dali::Integration::AndroidFramework::Get().SetApplicationAssets(nullptr);
223 Dali::Integration::AndroidFramework::Delete();
225 LOGV("android_main() <<");
227 // We need to kill the application process manually, DALi cannot exit the process properly due to memory leaks