Commit 1d3a43d6f7d92377858f0f655c3659e7881c912a

Authored by Adeel Kazmi
2 parents 94b12f95 a5128ae1

[dali_1.9.6] Merge branch 'devel/master'

Change-Id: I73f0bc5bd0a10021efda6fb32d39135d659035cb
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
  1 +package com.sec.dalidemo;
  2 +
  3 +public class DaliDemosNativeActivity extends DaliDemoNativeActivity {
  4 +}
... ...
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 &quot;${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&amp; 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&amp; 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
... ... @@ -132,8 +132,8 @@ public:
132 132 object* object_;
133 133 };
134 134 protected:
135   - int type_;
136   - _storage u_;
  135 + int type_{};
  136 + _storage u_ {};
137 137 public:
138 138 value();
139 139 value(int type, bool);
... ...
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
... ... @@ -2,7 +2,7 @@
2 2  
3 3 Name: com.samsung.dali-demo
4 4 Summary: The OpenGLES Canvas Core Demo
5   -Version: 1.9.5
  5 +Version: 1.9.6
6 6 Release: 1
7 7 Group: System/Libraries
8 8 License: Apache-2.0
... ...
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 }
... ...