Commit 1d3a43d6f7d92377858f0f655c3659e7881c912a
[dali_1.9.6] Merge branch 'devel/master'
Change-Id: I73f0bc5bd0a10021efda6fb32d39135d659035cb
Showing
15 changed files
with
288 additions
and
130 deletions
README.md
| ... | ... | @@ -78,8 +78,13 @@ Before running make install as normal: |
| 78 | 78 | |
| 79 | 79 | - Ubuntu 16.04 or later |
| 80 | 80 | - GCC version 6 |
| 81 | + - Android DALi dependencies | |
| 81 | 82 | |
| 82 | 83 | ### Building the Repository |
| 84 | +To download Android DALi dependencies clone https://github.com/dalihub/android-dependencies | |
| 85 | +in your DALi folder (folder containing dali-demo). | |
| 86 | + | |
| 87 | + $ git clone https://github.com/dalihub/android-dependencies.git | |
| 83 | 88 | |
| 84 | 89 | To build the repository enter the 'build/android' folder: |
| 85 | 90 | |
| ... | ... | @@ -93,6 +98,11 @@ For debug build: |
| 93 | 98 | |
| 94 | 99 | $ DEBUG=1 ./build.sh |
| 95 | 100 | |
| 101 | +To debug from Android Studio set Android DALi enviroment using setenv script in 'build/android' and launch Android Studio from the enviroment: | |
| 102 | + | |
| 103 | + $ . setenv | |
| 104 | + $ <path/to/androidstudio>/bin/studio.sh | |
| 105 | + | |
| 96 | 106 | To clean the build: |
| 97 | 107 | |
| 98 | 108 | $ ./build.sh clean |
| ... | ... | @@ -102,3 +112,4 @@ To install apks: |
| 102 | 112 | $ adb install -r ./app/build/outputs/apk/debug/dali-demo-debug.apk |
| 103 | 113 | $ adb install -r ./app/build/outputs/apk/release/dali-demo-release.apk |
| 104 | 114 | |
| 115 | + | ... | ... |
build/android/app/src/main/AndroidManifest.xml
| ... | ... | @@ -14,13 +14,30 @@ |
| 14 | 14 | android:label="@string/app_name" |
| 15 | 15 | android:name="com.sec.dalidemo.DaliDemoApplication"> |
| 16 | 16 | |
| 17 | + <activity android:name="com.sec.dalidemo.DaliDemoNativeActivity" | |
| 18 | + android:icon="@mipmap/dali_launcher" | |
| 19 | + android:label="DALi Example" | |
| 20 | + android:screenOrientation="portrait" | |
| 21 | + android:windowSoftInputMode="stateAlwaysVisible" | |
| 22 | + android:process=":example"> | |
| 23 | + <!-- Tell NativeActivity the name of our .so --> | |
| 24 | + <meta-data android:name="android.app.lib_name" | |
| 25 | + android:value="native-activity" /> | |
| 26 | + <meta-data android:name="start" | |
| 27 | + android:value="blocks.example" /> | |
| 28 | + <intent-filter> | |
| 29 | + <action android:name="android.intent.action.RUN" /> | |
| 30 | + </intent-filter> | |
| 31 | + </activity> | |
| 32 | + | |
| 17 | 33 | <!-- Our activity is the built-in NativeActivity framework class. |
| 18 | 34 | This will take care of integrating with our NDK code. --> |
| 19 | - <activity android:name="com.sec.dalidemo.DaliDemoNativeActivity" | |
| 35 | + <activity android:name="com.sec.dalidemo.DaliDemosNativeActivity" | |
| 20 | 36 | android:icon="@mipmap/dali_launcher" |
| 21 | 37 | android:label="@string/demo_name" |
| 22 | 38 | android:screenOrientation="portrait" |
| 23 | - android:windowSoftInputMode="stateAlwaysVisible"> | |
| 39 | + android:windowSoftInputMode="stateAlwaysVisible" | |
| 40 | + android:process=":dalidemos"> | |
| 24 | 41 | <!-- Tell NativeActivity the name of our .so --> |
| 25 | 42 | <meta-data android:name="android.app.lib_name" |
| 26 | 43 | android:value="native-activity" /> |
| ... | ... | @@ -37,7 +54,8 @@ |
| 37 | 54 | android:icon="@mipmap/dali_examples" |
| 38 | 55 | android:label="@string/examples_name" |
| 39 | 56 | android:screenOrientation="portrait" |
| 40 | - android:windowSoftInputMode="stateAlwaysVisible"> | |
| 57 | + android:windowSoftInputMode="stateAlwaysVisible" | |
| 58 | + android:process=":daliexamples"> | |
| 41 | 59 | <!-- Tell NativeActivity the name of our .so --> |
| 42 | 60 | <meta-data android:name="android.app.lib_name" |
| 43 | 61 | android:value="native-activity" /> |
| ... | ... | @@ -54,7 +72,8 @@ |
| 54 | 72 | android:icon="@mipmap/dali_tests" |
| 55 | 73 | android:label="@string/tests_name" |
| 56 | 74 | android:screenOrientation="portrait" |
| 57 | - android:windowSoftInputMode="stateAlwaysVisible"> | |
| 75 | + android:windowSoftInputMode="stateAlwaysVisible" | |
| 76 | + android:process=":dalitests"> | |
| 58 | 77 | <!-- Tell NativeActivity the name of our .so --> |
| 59 | 78 | <meta-data android:name="android.app.lib_name" |
| 60 | 79 | android:value="native-activity" /> | ... | ... |
build/android/app/src/main/cpp/CMakeLists.txt
| ... | ... | @@ -24,6 +24,7 @@ ADD_LIBRARY(native-activity SHARED main.cpp) |
| 24 | 24 | TARGET_INCLUDE_DIRECTORIES(native-activity PRIVATE |
| 25 | 25 | ${ANDROID_NDK}/sources/android/native_app_glue) |
| 26 | 26 | |
| 27 | +INCLUDE_DIRECTORIES(.) | |
| 27 | 28 | INCLUDE_DIRECTORIES(${DALI_ENV_DIR}/include) |
| 28 | 29 | INCLUDE_DIRECTORIES(${DALI_ENV_DIR}/include/dali) |
| 29 | 30 | ... | ... |
build/android/app/src/main/cpp/dali-demo-native-activity-jni.h
0 โ 100644
| 1 | +/* | |
| 2 | + * Copyright (c) 2020 Samsung Electronics Co., Ltd. | |
| 3 | + * | |
| 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 | |
| 7 | + * | |
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | + * | |
| 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. | |
| 15 | + */ | |
| 16 | + | |
| 17 | +#ifndef ANDROID_DALI_DEMO_NATIVE_ACTIVITY_JNI_H | |
| 18 | +#define ANDROID_DALI_DEMO_NATIVE_ACTIVITY_JNI_H | |
| 19 | + | |
| 20 | +#include <string> | |
| 21 | +#include <android_native_app_glue.h> | |
| 22 | + | |
| 23 | +class DaliDemoNativeActivity | |
| 24 | +{ | |
| 25 | +public: | |
| 26 | + DaliDemoNativeActivity(ANativeActivity* activity) | |
| 27 | + : activity(activity) | |
| 28 | + { | |
| 29 | + } | |
| 30 | + | |
| 31 | + class JString | |
| 32 | + { | |
| 33 | + public: | |
| 34 | + JString(JNIEnv* env, const std::string& str) | |
| 35 | + : env(env), | |
| 36 | + string(env->NewStringUTF(str.c_str())) | |
| 37 | + { | |
| 38 | + } | |
| 39 | + | |
| 40 | + JString(JNIEnv* env, jstring str) | |
| 41 | + : env(env), | |
| 42 | + string(str) | |
| 43 | + { | |
| 44 | + } | |
| 45 | + | |
| 46 | + std::string ToString() | |
| 47 | + { | |
| 48 | + std::string out; | |
| 49 | + if (string) | |
| 50 | + { | |
| 51 | + const char* utf = env->GetStringUTFChars(string, 0); | |
| 52 | + out = std::string(utf); | |
| 53 | + env->ReleaseStringUTFChars(string, utf); | |
| 54 | + } | |
| 55 | + return out; | |
| 56 | + } | |
| 57 | + | |
| 58 | + ~JString() | |
| 59 | + { | |
| 60 | + if (string) | |
| 61 | + { | |
| 62 | + env->DeleteLocalRef(string); | |
| 63 | + } | |
| 64 | + } | |
| 65 | + | |
| 66 | + private: | |
| 67 | + friend class DaliDemoNativeActivity; | |
| 68 | + JNIEnv* env; | |
| 69 | + jstring string; | |
| 70 | + }; | |
| 71 | + | |
| 72 | + class NativeActivityJNI | |
| 73 | + { | |
| 74 | + public: | |
| 75 | + NativeActivityJNI(ANativeActivity* activity) | |
| 76 | + : activity(activity) | |
| 77 | + { | |
| 78 | + activity->vm->AttachCurrentThread(&env, nullptr); | |
| 79 | + clazz = env->GetObjectClass(activity->clazz); | |
| 80 | + } | |
| 81 | + | |
| 82 | + ~NativeActivityJNI() | |
| 83 | + { | |
| 84 | + activity->vm->DetachCurrentThread(); | |
| 85 | + } | |
| 86 | + | |
| 87 | + std::string CallStringMethod(const std::string& name, const std::string& arg) | |
| 88 | + { | |
| 89 | + jmethodID methodID = env->GetMethodID(clazz, name.c_str(), "(Ljava/lang/String;)Ljava/lang/String;"); | |
| 90 | + JString argument(env, arg); | |
| 91 | + JString returnValue(env, (jstring)env->CallObjectMethod(activity->clazz, methodID, argument.string)); | |
| 92 | + return returnValue.ToString(); | |
| 93 | + } | |
| 94 | + | |
| 95 | + void CallVoidMethod(const std::string& name, const std::string& arg) | |
| 96 | + { | |
| 97 | + jmethodID methodID = env->GetMethodID(clazz, name.c_str(), "(Ljava/lang/String;)V"); | |
| 98 | + JString argument(env, arg); | |
| 99 | + env->CallVoidMethod(activity->clazz, methodID, argument.string); | |
| 100 | + } | |
| 101 | + | |
| 102 | + private: | |
| 103 | + ANativeActivity* activity; | |
| 104 | + JNIEnv* env; | |
| 105 | + jclass clazz; | |
| 106 | + }; | |
| 107 | + | |
| 108 | + std::string GetMetaData(const std::string& key) | |
| 109 | + { | |
| 110 | + NativeActivityJNI nativeActivityJNI(activity); | |
| 111 | + return nativeActivityJNI.CallStringMethod("getMetaData", key); | |
| 112 | + } | |
| 113 | + | |
| 114 | + std::string GetIntentStringExtra(const std::string& key) | |
| 115 | + { | |
| 116 | + NativeActivityJNI nativeActivityJNI(activity); | |
| 117 | + return nativeActivityJNI.CallStringMethod("getIntentStringExtra", key); | |
| 118 | + } | |
| 119 | + | |
| 120 | + void LaunchExample(const std::string& exampleName) | |
| 121 | + { | |
| 122 | + NativeActivityJNI nativeActivityJNI(activity); | |
| 123 | + return nativeActivityJNI.CallVoidMethod("launchExample", exampleName); | |
| 124 | + } | |
| 125 | + | |
| 126 | +private: | |
| 127 | + ANativeActivity* activity; | |
| 128 | +}; | |
| 129 | + | |
| 130 | +#endif //ANDROID_DALI_DEMO_NATIVE_ACTIVITY_JNI_H | ... | ... |
build/android/app/src/main/cpp/main.cpp
| ... | ... | @@ -22,6 +22,7 @@ |
| 22 | 22 | |
| 23 | 23 | #include <android/log.h> |
| 24 | 24 | #include <android_native_app_glue.h> |
| 25 | +#include <dali-demo-native-activity-jni.h> | |
| 25 | 26 | #include <dali/devel-api/adaptor-framework/application-devel.h> |
| 26 | 27 | #include <dali/integration-api/debug.h> |
| 27 | 28 | #include <dali/integration-api/adaptor-framework/android/android-framework.h> |
| ... | ... | @@ -39,16 +40,17 @@ namespace |
| 39 | 40 | |
| 40 | 41 | void free_saved_state(struct android_app *android_app) |
| 41 | 42 | { |
| 42 | - pthread_mutex_lock(&android_app->mutex); | |
| 43 | + LOGV("free_saved_state"); | |
| 44 | + pthread_mutex_lock(&android_app->mutex); | |
| 43 | 45 | |
| 44 | - if (android_app->savedState != NULL) | |
| 45 | - { | |
| 46 | - free(android_app->savedState); | |
| 47 | - android_app->savedState = NULL; | |
| 48 | - android_app->savedStateSize = 0; | |
| 49 | - } | |
| 46 | + if (android_app->savedState != NULL) | |
| 47 | + { | |
| 48 | + free(android_app->savedState); | |
| 49 | + android_app->savedState = NULL; | |
| 50 | + android_app->savedStateSize = 0; | |
| 51 | + } | |
| 50 | 52 | |
| 51 | - pthread_mutex_unlock(&android_app->mutex); | |
| 53 | + pthread_mutex_unlock(&android_app->mutex); | |
| 52 | 54 | } |
| 53 | 55 | |
| 54 | 56 | void android_app_destroy(struct android_app *android_app) |
| ... | ... | @@ -145,77 +147,12 @@ void ExtractFontConfig(struct android_app* state, std::string assetFontConfig, s |
| 145 | 147 | } |
| 146 | 148 | } |
| 147 | 149 | |
| 148 | -class DaliDemoNativeActivity | |
| 149 | -{ | |
| 150 | -public: | |
| 151 | - ANativeActivity* activity; | |
| 152 | - DaliDemoNativeActivity(ANativeActivity* activity) | |
| 153 | - : activity(activity) | |
| 154 | - { | |
| 155 | - } | |
| 156 | - | |
| 157 | - class NativeActivityJNI | |
| 158 | - { | |
| 159 | - public: | |
| 160 | - ANativeActivity* activity; | |
| 161 | - JNIEnv* env; | |
| 162 | - jclass clazz; | |
| 163 | - | |
| 164 | - NativeActivityJNI(ANativeActivity* activity) | |
| 165 | - : activity(activity) | |
| 166 | - { | |
| 167 | - activity->vm->AttachCurrentThread(&env, NULL); | |
| 168 | - clazz = env->GetObjectClass(activity->clazz); | |
| 169 | - } | |
| 170 | - | |
| 171 | - ~NativeActivityJNI() | |
| 172 | - { | |
| 173 | - activity->vm->DetachCurrentThread(); | |
| 174 | - } | |
| 175 | - | |
| 176 | - jstring toJString(const std::string& str) | |
| 177 | - { | |
| 178 | - return env->NewStringUTF(str.c_str()); | |
| 179 | - } | |
| 180 | - | |
| 181 | - std::string toString(jstring jstr) | |
| 182 | - { | |
| 183 | - std::string out; | |
| 184 | - if (jstr) | |
| 185 | - { | |
| 186 | - const char* utf = env->GetStringUTFChars(jstr, 0); | |
| 187 | - out = std::string(utf); | |
| 188 | - env->ReleaseStringUTFChars(jstr, utf); | |
| 189 | - } | |
| 190 | - | |
| 191 | - return out; | |
| 192 | - } | |
| 193 | - | |
| 194 | - std::string callStringMethod(const std::string& name, const std::string& arg) | |
| 195 | - { | |
| 196 | - jmethodID methodID = env->GetMethodID(clazz, name.c_str(), "(Ljava/lang/String;)Ljava/lang/String;"); | |
| 197 | - jstring jstr = (jstring)env->CallObjectMethod(activity->clazz, methodID, toJString(arg)); | |
| 198 | - return toString(jstr); | |
| 199 | - } | |
| 200 | - }; | |
| 201 | - | |
| 202 | - std::string getMetaData(const std::string& key) | |
| 203 | - { | |
| 204 | - NativeActivityJNI nativeActivityJNI(activity); | |
| 205 | - return nativeActivityJNI.callStringMethod("getMetaData", key); | |
| 206 | - } | |
| 207 | - | |
| 208 | - std::string getIntentStringExtra(const std::string& key) | |
| 209 | - { | |
| 210 | - NativeActivityJNI nativeActivityJNI(activity); | |
| 211 | - return nativeActivityJNI.callStringMethod("getIntentStringExtra", key); | |
| 212 | - } | |
| 213 | -}; | |
| 214 | - | |
| 215 | 150 | extern "C" void FcConfigPathInit(const char* path, const char* file); |
| 216 | 151 | |
| 217 | 152 | void android_main( struct android_app* state ) |
| 218 | 153 | { |
| 154 | + LOGV("android_main() >>"); | |
| 155 | + | |
| 219 | 156 | std::string filesDir = state->activity->internalDataPath; |
| 220 | 157 | |
| 221 | 158 | std::string fontconfigPath = filesDir + "/fonts"; |
| ... | ... | @@ -239,19 +176,19 @@ void android_main( struct android_app* state ) |
| 239 | 176 | } |
| 240 | 177 | |
| 241 | 178 | Dali::Integration::AndroidFramework::New(); |
| 242 | - Dali::Integration::AndroidFramework::Get().SetNativeApplication( state ); | |
| 243 | - Dali::Integration::AndroidFramework::Get().SetApplicationConfiguration( state->config ); | |
| 244 | - Dali::Integration::AndroidFramework::Get().SetApplicationAssets( state->activity->assetManager ); | |
| 245 | - Dali::Integration::AndroidFramework::Get().SetInternalDataPath( filesDir ); | |
| 179 | + Dali::Integration::AndroidFramework::Get().SetNativeApplication(state); | |
| 180 | + Dali::Integration::AndroidFramework::Get().SetApplicationConfiguration(state->config); | |
| 181 | + Dali::Integration::AndroidFramework::Get().SetApplicationAssets(state->activity->assetManager); | |
| 182 | + Dali::Integration::AndroidFramework::Get().SetInternalDataPath(filesDir); | |
| 246 | 183 | |
| 247 | 184 | DaliDemoNativeActivity nativeActivity(state->activity); |
| 248 | 185 | |
| 249 | 186 | int status = 0; |
| 250 | 187 | std::string libpath = "/data/data/com.sec.dalidemo/lib/libdali-demo.so"; |
| 251 | - std::string callParam = nativeActivity.getIntentStringExtra("start"); | |
| 188 | + std::string callParam = nativeActivity.GetIntentStringExtra("start"); | |
| 252 | 189 | if (callParam.empty()) |
| 253 | 190 | { |
| 254 | - callParam = nativeActivity.getMetaData("start"); | |
| 191 | + callParam = nativeActivity.GetMetaData("start"); | |
| 255 | 192 | } |
| 256 | 193 | |
| 257 | 194 | if (!callParam.empty()) |
| ... | ... | @@ -259,7 +196,7 @@ void android_main( struct android_app* state ) |
| 259 | 196 | libpath = "/data/data/com.sec.dalidemo/lib/lib" + callParam + ".so"; |
| 260 | 197 | } |
| 261 | 198 | |
| 262 | - void* handle = dlopen( libpath.c_str(), RTLD_LAZY ); | |
| 199 | + void* handle = dlopen(libpath.c_str(), RTLD_LAZY); | |
| 263 | 200 | if (!handle) |
| 264 | 201 | { |
| 265 | 202 | std::exit(status); |
| ... | ... | @@ -286,7 +223,9 @@ void android_main( struct android_app* state ) |
| 286 | 223 | Dali::Integration::AndroidFramework::Get().SetApplicationAssets(nullptr); |
| 287 | 224 | Dali::Integration::AndroidFramework::Delete(); |
| 288 | 225 | |
| 289 | - // We need to kill the application process manually, DALi cannot restart in the same process due to memory leaks | |
| 226 | + LOGV("android_main() <<"); | |
| 227 | + | |
| 228 | + // We need to kill the application process manually, DALi cannot exit the process properly due to memory leaks | |
| 290 | 229 | std::exit(status); |
| 291 | 230 | } |
| 292 | 231 | ... | ... |
build/android/app/src/main/java/com/sec/dalidemo/DaliDemoNativeActivity.java
| ... | ... | @@ -4,6 +4,7 @@ import android.annotation.TargetApi; |
| 4 | 4 | import android.app.NativeActivity; |
| 5 | 5 | import android.content.ComponentName; |
| 6 | 6 | import android.content.Context; |
| 7 | +import android.content.Intent; | |
| 7 | 8 | import android.content.pm.ActivityInfo; |
| 8 | 9 | import android.content.pm.ApplicationInfo; |
| 9 | 10 | import android.content.pm.PackageManager; |
| ... | ... | @@ -94,4 +95,10 @@ public class DaliDemoNativeActivity extends NativeActivity { |
| 94 | 95 | public final String getIntentStringExtra(String key) { |
| 95 | 96 | return getIntent().getStringExtra(key); |
| 96 | 97 | } |
| 98 | + | |
| 99 | + public final void launchExample(String exampleName) { | |
| 100 | + Intent intent = new Intent(this, DaliDemoNativeActivity.class); | |
| 101 | + intent.putExtra("start", exampleName); | |
| 102 | + startActivity(intent); | |
| 103 | + } | |
| 97 | 104 | } | ... | ... |
build/android/app/src/main/java/com/sec/dalidemo/DaliDemosNativeActivity.java
0 โ 100644
build/android/build.sh
| ... | ... | @@ -43,6 +43,10 @@ fi |
| 43 | 43 | if [ ! -d "$ANDROID_NDK" ]; then |
| 44 | 44 | if [ -d "$ANDROID_SDK" ]; then |
| 45 | 45 | NDK_DIR=$(find $ANDROID_SDK -maxdepth 2 -name ndk-build | sed 's/\/ndk-build//') |
| 46 | + # Some sdk folder structures have extra <version> dir for ndk folders. | |
| 47 | + if [ ! -d "$NDK_DIR" ]; then | |
| 48 | + NDK_DIR=$(find $ANDROID_SDK -maxdepth 3 -name ndk-build | sed 's/\/ndk-build//') | |
| 49 | + fi | |
| 46 | 50 | if [ -d "$NDK_DIR" ]; then |
| 47 | 51 | export ANDROID_NDK=$NDK_DIR |
| 48 | 52 | fi | ... | ... |
build/android/setenv
0 โ 100755
| 1 | +[ -z $ROOT_DIR ] && ROOT_DIR=$HOME | |
| 2 | +echo "Using ROOT_DIR=\"$ROOT_DIR\"" | |
| 3 | + | |
| 4 | +[ -z $DALI_DIR ] && DALI_DIR=$(cd ../../../;pwd) | |
| 5 | +echo "Using DALI_DIR=\"$DALI_DIR\"" | |
| 6 | +export DALI_DIR=$DALI_DIR | |
| 7 | + | |
| 8 | +[ -z $DALI_ENV_DIR ] && DALI_ENV_DIR=$DALI_DIR/dali-env/android | |
| 9 | +echo "Using DALI_ENV_DIR=\"$DALI_ENV_DIR\"" | |
| 10 | +export DALI_ENV_DIR=$DALI_ENV_DIR | |
| 11 | + | |
| 12 | +[ -z $TARGET ] && export TARGET=armeabi-v7a | |
| 13 | +echo "Using TARGET=\"$TARGET\"" | |
| 14 | + | |
| 15 | +if [ ! -d "$ANDROID_SDK" ]; then | |
| 16 | +# try default path | |
| 17 | + if [ -d "$ROOT_DIR/Android/Sdk" ]; then | |
| 18 | + export ANDROID_SDK=$ROOT_DIR/Android/Sdk | |
| 19 | + fi | |
| 20 | +fi | |
| 21 | +echo "Using ANDROID_SDK=\"$ANDROID_SDK\"" | |
| 22 | + | |
| 23 | +if [ ! -d "$ANDROID_NDK" ]; then | |
| 24 | + if [ -d "$ANDROID_SDK" ]; then | |
| 25 | + NDK_DIR=$(find $ANDROID_SDK -maxdepth 2 -name ndk-build | sed 's/\/ndk-build//') | |
| 26 | + # Some sdk folder structures have extra <version> dir for ndk folders. | |
| 27 | + if [ ! -d "$NDK_DIR" ]; then | |
| 28 | + NDK_DIR=$(find $ANDROID_SDK -maxdepth 3 -name ndk-build | sed 's/\/ndk-build//') | |
| 29 | + fi | |
| 30 | + if [ -d "$NDK_DIR" ]; then | |
| 31 | + export ANDROID_NDK=$NDK_DIR | |
| 32 | + fi | |
| 33 | + fi | |
| 34 | +fi | |
| 35 | +echo "Using ANDROID_NDK=\"$ANDROID_NDK\"" | ... | ... |
build/tizen/CMakeLists.txt
| ... | ... | @@ -207,6 +207,12 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${REQUIRED_CFLAGS} ${DALI_DEMO_CFLAGS} -Werr |
| 207 | 207 | SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS}") |
| 208 | 208 | |
| 209 | 209 | INCLUDE_DIRECTORIES(${ROOT_SRC_DIR}) |
| 210 | +IF(ANDROID) | |
| 211 | + INCLUDE_DIRECTORIES( ${ANDROID_NDK}/sources/android/native_app_glue ) | |
| 212 | + INCLUDE_DIRECTORIES( ${ANDROID_NDK}/sysroot/usr ) | |
| 213 | + INCLUDE_DIRECTORIES( ${ANDROID_NDK}/sysroot/usr/include/android ) | |
| 214 | + INCLUDE_DIRECTORIES( ${ROOT_SRC_DIR}/build/android/app/src/main/cpp ) | |
| 215 | +ENDIF() | |
| 210 | 216 | |
| 211 | 217 | ADD_SUBDIRECTORY(demo) |
| 212 | 218 | ADD_SUBDIRECTORY(examples) | ... | ... |
examples/reflection-demo/gltf-scene.cpp
| ... | ... | @@ -185,7 +185,7 @@ void glTF::LoadFromFile( const std::string& filename ) |
| 185 | 185 | } |
| 186 | 186 | else |
| 187 | 187 | { |
| 188 | - GLTF_LOG( "GLTF: %s loaded, size = %d", binFile.c_str(), int(mBuffer.size())); | |
| 188 | + GLTF_LOG( "GLTF: %s loaded, size = %d", binFile.c_str(), int(jsonBuffer.size())); | |
| 189 | 189 | } |
| 190 | 190 | |
| 191 | 191 | // Abort if errors |
| ... | ... | @@ -412,12 +412,18 @@ glTF_Buffer glTF::LoadFile( const std::string& filename ) |
| 412 | 412 | std::vector<unsigned char> buffer; |
| 413 | 413 | if( fin ) |
| 414 | 414 | { |
| 415 | - fseek( fin, 0, SEEK_END ); | |
| 415 | + if( fseek( fin, 0, SEEK_END ) ) | |
| 416 | + { | |
| 417 | + return {}; | |
| 418 | + } | |
| 416 | 419 | auto size = ftell(fin); |
| 417 | - fseek( fin, 0, SEEK_SET ); | |
| 420 | + if( fseek( fin, 0, SEEK_SET ) ) | |
| 421 | + { | |
| 422 | + return {}; | |
| 423 | + } | |
| 418 | 424 | buffer.resize(unsigned(size)); |
| 419 | 425 | auto result = fread( buffer.data(), 1, size_t(size), fin ); |
| 420 | - if( result < 0 ) | |
| 426 | + if( result != size_t(size) ) | |
| 421 | 427 | { |
| 422 | 428 | GLTF_LOG("LoadFile: Result: %d", int(result)); |
| 423 | 429 | // return empty buffer | ... | ... |
examples/reflection-demo/pico-json.h
examples/reflection-demo/reflection-example.cpp
| ... | ... | @@ -639,30 +639,31 @@ private: |
| 639 | 639 | } |
| 640 | 640 | |
| 641 | 641 | private: |
| 642 | + | |
| 642 | 643 | Application& mApplication; |
| 643 | 644 | |
| 644 | - Layer mLayer3D; | |
| 645 | + Layer mLayer3D{}; | |
| 645 | 646 | |
| 646 | - std::vector<Actor> mActors; | |
| 647 | - std::vector<CameraActor> mCameras; | |
| 648 | - std::vector<std::unique_ptr<Model>> mModels; | |
| 649 | - std::vector<TextureSet> mTextureSets; | |
| 647 | + std::vector<Actor> mActors {}; | |
| 648 | + std::vector<CameraActor> mCameras {}; | |
| 649 | + std::vector<std::unique_ptr<Model>> mModels {}; | |
| 650 | + std::vector<TextureSet> mTextureSets {}; | |
| 650 | 651 | |
| 651 | - Animation mAnimation; | |
| 652 | - float mMockTime = 0.0f; | |
| 653 | - float mKFactor = 0.0f; | |
| 654 | - Property::Index mSunTimeUniformIndex; | |
| 655 | - Property::Index mSunKFactorUniformIndex; | |
| 656 | - PanGestureDetector mPanGestureDetector; | |
| 652 | + Animation mAnimation {}; | |
| 653 | + float mMockTime { 0.0f }; | |
| 654 | + float mKFactor { 0.0f }; | |
| 655 | + Property::Index mSunTimeUniformIndex {}; | |
| 656 | + Property::Index mSunKFactorUniformIndex {}; | |
| 657 | + PanGestureDetector mPanGestureDetector {}; | |
| 657 | 658 | |
| 658 | - Vector3 mCameraPos; | |
| 659 | - Vector3 mLightDir; | |
| 660 | - Timer mTickTimer; | |
| 659 | + Vector3 mCameraPos { Vector3::ZERO }; | |
| 660 | + Vector3 mLightDir { Vector3::ZERO }; | |
| 661 | + Timer mTickTimer {}; | |
| 661 | 662 | |
| 662 | - CameraActor mCamera3D; | |
| 663 | - CameraActor mReflectionCamera3D; | |
| 664 | - Actor mCenterActor; | |
| 665 | - Actor mCenterHorizActor; | |
| 663 | + CameraActor mCamera3D {}; | |
| 664 | + CameraActor mReflectionCamera3D {}; | |
| 665 | + Actor mCenterActor {}; | |
| 666 | + Actor mCenterHorizActor {}; | |
| 666 | 667 | }; |
| 667 | 668 | |
| 668 | 669 | int DALI_EXPORT_API main( int argc, char **argv ) | ... | ... |
packaging/com.samsung.dali-demo.spec
shared/execute-process-android.cpp
| ... | ... | @@ -21,28 +21,23 @@ |
| 21 | 21 | // EXTERNAL INCLUDES |
| 22 | 22 | #include <sstream> |
| 23 | 23 | #include <unistd.h> |
| 24 | + | |
| 24 | 25 | #include <dali/public-api/common/dali-common.h> |
| 26 | +#include <dali/integration-api/debug.h> | |
| 27 | +#include <dali/integration-api/adaptor-framework/android/android-framework.h> | |
| 28 | + | |
| 29 | +#include <android_native_app_glue.h> | |
| 30 | +#include <dali-demo-native-activity-jni.h> | |
| 25 | 31 | |
| 26 | 32 | void ExecuteProcess( const std::string& processName, Dali::Application& application ) |
| 27 | 33 | { |
| 28 | - std::stringstream stream; | |
| 29 | - stream << "am start -a android.intent.action.MAIN -n com.sec.dalidemo/.DaliDemoNativeActivity --user 0 --es start " << processName.c_str(); | |
| 30 | - pid_t parentPID = getpid(); | |
| 31 | - | |
| 32 | - pid_t pid = fork(); | |
| 33 | - if( pid == 0 ) | |
| 34 | + struct android_app* nativeApp = Dali::Integration::AndroidFramework::Get().GetNativeApplication(); | |
| 35 | + if (!nativeApp) | |
| 34 | 36 | { |
| 35 | - do | |
| 36 | - { | |
| 37 | - sleep( 1 ); | |
| 38 | - } | |
| 39 | - while( kill( parentPID, 0 ) == 0 ); | |
| 40 | - | |
| 41 | - system( stream.str().c_str() ); | |
| 42 | - exit( 0 ); | |
| 43 | - } | |
| 44 | - else | |
| 45 | - { | |
| 46 | - application.Quit(); | |
| 37 | + DALI_LOG_ERROR("Couldn't get native app."); | |
| 38 | + return; | |
| 47 | 39 | } |
| 40 | + | |
| 41 | + DaliDemoNativeActivity nativeActivity(nativeApp->activity); | |
| 42 | + nativeActivity.LaunchExample(processName); | |
| 48 | 43 | } | ... | ... |