{"id":165523,"date":"2013-01-15T08:58:02","date_gmt":"2013-01-15T04:58:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=165523"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=165523","title":{"rendered":"<span class=\"post_title\">\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430 \u0421++ \u0434\u043b\u044f BlackBerry 10 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f IDE (\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c OpenGL ES 2)<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041f\u043e\u0434 BlackBerry OS 10 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438: QNX Momentics IDE, \u043d\u0430 \u0431\u0430\u0437\u0435 Eclipse. \u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u043e \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043b\u0434\u043e\u0432, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0438\u043b\u0434-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 TeamCity, \u0442\u043e IDE \u043d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a \u0441\u043e\u0431\u0430\u043a\u0435 \u043f\u044f\u0442\u0430\u044f \u043d\u043e\u0433\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e <a href=\"http:\/\/www.linderdaum.com\">\u0434\u0432\u0438\u0436\u043a\u0430<\/a> \u043d\u0430 BlackBerry. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u2014 \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f IDE.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h4>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h4>\n<p>  \u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<\/p>\n<ul>\n<li>BlackBerry 10 Native SDK \u0438 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432: <a href=\"http:\/\/developer.blackberry.com\/native\/download\/\">developer.blackberry.com\/native\/download\/<\/a><\/li>\n<li>Python: <a href=\"http:\/\/python.org\/download\">python.org\/download<\/a><\/li>\n<\/ul>\n<h4>C++ \u043f\u0440\u043e\u0435\u043a\u0442<\/h4>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0441\u044b\u0440\u0435\u0446 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OpenGL ES 2. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <b>main.cpp<\/b>:<\/p>\n<pre><code class=\"cpp\">#include &lt;assert.h&gt; #include &lt;screen\/screen.h&gt; #include &lt;bps\/navigator.h&gt; #include &lt;bps\/screen.h&gt; #include &lt;bps\/bps.h&gt; #include &lt;bps\/event.h&gt; #include &lt;bps\/locale.h&gt; #include &lt;bps\/virtualkeyboard.h&gt; #include &lt;sys\/keycodes.h&gt; #include &lt;input\/event_types.h&gt; #include &lt;input\/screen_helpers.h&gt; #include &lt;stdarg.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; #include &lt;EGL\/egl.h&gt; #include &lt;GLES2\/gl2.h&gt; #include &quot;bbutil.h&quot;  static const char g_vShaderStr[] = \t\t&quot;#version 100\\n&quot; \t   &quot;precision highp float;\\n&quot; \t   &quot;attribute vec3 vPosition;\\n&quot; \t   &quot;attribute vec3 vColor;\\n&quot; \t   &quot;varying vec4 Color;\\n&quot; \t   &quot;void main()\\n&quot; \t   &quot;{\\n&quot; \t   &quot;   Color = vec4( vColor, 1.0 );\\n&quot; \t   &quot;   gl_Position = vec4( vPosition, 1.0 );\\n&quot; \t   &quot;}\\n&quot;;  static const char g_fShaderStr[] = \t\t&quot;#version 100\\n&quot; \t   &quot;precision highp float;\\n&quot; \t   &quot;varying vec4 Color;\\n&quot; \t   &quot;void main()\\n&quot; \t   &quot;{\\n&quot; \t   &quot;   gl_FragColor = Color;\\n&quot; \t   &quot;}\\n&quot;;  static GLuint g_ProgramObject = 0;  static GLuint LoadShader( GLenum type, const char* shaderSrc ) { \tGLuint shader = glCreateShader( type ); \tglShaderSource ( shader, 1, &shaderSrc, NULL ); \tglCompileShader ( shader ); \tGLint compiled; \tglGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled ); \tGLsizei MaxLength = 0; \tglGetShaderiv( shader, GL_INFO_LOG_LENGTH, &MaxLength ); \tchar* InfoLog = new char[MaxLength]; \tglGetShaderInfoLog( shader, MaxLength, &MaxLength, InfoLog ); \treturn shader; }  static void GLDebug_LoadStaticProgramObject() { \tif ( g_ProgramObject == 0 ) \t{ \t\tGLuint vertexShader = LoadShader ( GL_VERTEX_SHADER, g_vShaderStr ); \t\tGLuint fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, g_fShaderStr ); \t\tg_ProgramObject = glCreateProgram ( ); \t\tglAttachShader ( g_ProgramObject, vertexShader ); \t\tglAttachShader ( g_ProgramObject, fragmentShader ); \t\tglLinkProgram ( g_ProgramObject ); \t\tGLint linked; \t\tglGetProgramiv ( g_ProgramObject, GL_LINK_STATUS, &linked ); \t\tGLsizei Length    = 0; \t\tGLsizei MaxLength = 0; \t\tglGetProgramiv( g_ProgramObject, GL_INFO_LOG_LENGTH, &MaxLength ); \t\tchar* InfoLog = new char[MaxLength]; \t\tglGetProgramInfoLog( g_ProgramObject, MaxLength, &Length, InfoLog ); \t} }  static void GLDebug_RenderTriangle() { \tconst GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; \tconst GLfloat vColors[]   = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f };  \tglUseProgram ( g_ProgramObject ); \tGLint Loc1 = glGetAttribLocation( g_ProgramObject, &quot;vPosition&quot; ); \tGLint Loc2 = glGetAttribLocation( g_ProgramObject, &quot;vColor&quot; );  \tglBindBuffer( GL_ARRAY_BUFFER, 0 ); \tglBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); \tglVertexAttribPointer ( Loc1, 3, GL_FLOAT, GL_FALSE, 0, vVertices ); \tglVertexAttribPointer ( Loc2, 3, GL_FLOAT, GL_FALSE, 0, vColors   ); \tglEnableVertexAttribArray ( Loc1 ); \tglEnableVertexAttribArray ( Loc2 );  \t\/\/glUseProgram ( g_ProgramObject ); \tglDisable( GL_DEPTH_TEST ); \tglDrawArrays ( GL_TRIANGLES, 0, 3 ); \tglUseProgram ( 0 ); \tglDisableVertexAttribArray ( Loc1 ); \tglDisableVertexAttribArray ( Loc2 ); }  static screen_context_t screen_cxt;  void handleScreenEvent( bps_event_t* event ) { \tscreen_event_t screen_event = screen_event_get_event( event );  \t\/\/ handle clicks, touches, keypresses }  void handleNavigatorEvent( bps_event_t* event ) { \tint rc; \tbps_event_t* activation_event = NULL;  \tswitch ( bps_event_get_code( event ) ) \t{ \t\tcase NAVIGATOR_ORIENTATION_CHECK: \t\t\t\/\/ signal navigator that we do not intend to resize \t\t\tnavigator_orientation_check_response( event, false ); \t\t\tbreak; \t} }  int main( int argc, char* argv[] ) { \tint rc; \tint exit_application = 0;  \tscreen_create_context( &screen_cxt, 0 );  \tbps_initialize();  \t\/\/Use utility code to initialize EGL for rendering with GL ES 2.0 \tif ( EXIT_SUCCESS != bbutil_init_egl( screen_cxt ) ) \t{ \t\tfprintf( stderr, &quot;bbutil_init_egl failed\\n&quot; ); \t\tbbutil_terminate(); \t\tscreen_destroy_context( screen_cxt ); \t\treturn 0; \t}  \t\/\/ Signal BPS library that navigator and screen events will be requested \tif ( BPS_SUCCESS != screen_request_events( screen_cxt ) ) \t{ \t\tfprintf( stderr, &quot;screen_request_events failed\\n&quot; ); \t\tbbutil_terminate(); \t\tscreen_destroy_context( screen_cxt ); \t\tbps_shutdown(); \t\treturn 0; \t}  \tif ( BPS_SUCCESS != navigator_request_events( 0 ) ) \t{ \t\tfprintf( stderr, &quot;navigator_request_events failed\\n&quot; ); \t\tbbutil_terminate(); \t\tscreen_destroy_context( screen_cxt ); \t\tbps_shutdown(); \t\treturn 0; \t}  \tif ( BPS_SUCCESS != virtualkeyboard_request_events( 0 ) ) \t{ \t\tfprintf( stderr, &quot;virtualkeyboard_request_events failed\\n&quot; ); \t\tbbutil_terminate(); \t\tscreen_destroy_context( screen_cxt ); \t\tbps_shutdown(); \t\treturn 0; \t}  \t\/\/ Signal BPS library that navigator orientation is not to be locked \tif ( BPS_SUCCESS != navigator_rotation_lock( false ) ) \t{ \t\tfprintf( stderr, &quot;navigator_rotation_lock failed\\n&quot; ); \t\tbbutil_terminate(); \t\tscreen_destroy_context( screen_cxt ); \t\tbps_shutdown(); \t\treturn 0; \t}  \t\/\/ Query width and height of the window surface created by utility code \tEGLint surface_width, surface_height; \teglQuerySurface( egl_disp, egl_surf, EGL_WIDTH, &surface_width ); \teglQuerySurface( egl_disp, egl_surf, EGL_HEIGHT, &surface_height );  \tGLDebug_LoadStaticProgramObject();  \twhile ( !exit_application ) \t{ \t\tglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );  \t\t\/\/ Request and process all available BPS events \t\tbps_event_t* event = NULL;  \t\tfor ( ;; ) \t\t{ \t\t\trc = bps_get_event( &event, 0 ); \t\t\tassert( rc == BPS_SUCCESS );  \t\t\tif ( event ) \t\t\t{ \t\t\t\tint domain = bps_event_get_domain( event );  \t\t\t\tif ( domain == screen_get_domain() ) \t\t\t\t{ \t\t\t\t\thandleScreenEvent( event ); \t\t\t\t} \t\t\t\telse if ( domain == navigator_get_domain() ) \t\t\t\t{ \t\t\t\t\thandleNavigatorEvent( event ); \t\t\t\t\tif ( NAVIGATOR_EXIT == bps_event_get_code( event ) ) { exit_application = 1; } \t\t\t\t} \t\t\t} \t\t\telse break; \t\t}  \t\t\/\/ render frame here \t\tGLDebug_RenderTriangle();  \t\tbbutil_swap(); \t}  \t\/\/ Stop requesting events from libscreen \tscreen_stop_events( screen_cxt );  \t\/\/ Shut down BPS library for this process \tbps_shutdown();  \t\/\/ Use utility code to terminate EGL setup \tbbutil_terminate();  \t\/\/ Destroy libscreen context \tscreen_destroy_context( screen_cxt );  \treturn 0; } <\/code><\/pre>\n<p>  \u0415\u0449\u0451 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f bbutil.c \u0438 bbutil.h \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 BlackBerry 10 Native SDK. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0441\u043e\u043a\u0440\u043e\u0432\u0438\u0449, \u0432\u043e\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 (\u043d\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0438\u043d\u0438\u043f\u0440\u0438\u043c\u0435\u0440\u0430):<\/p>\n<pre><code class=\"cpp\">\/*  * Copyright (c) 2011-2012 Research In Motion Limited.  *  * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  * http:\/\/www.apache.org\/licenses\/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  *\/  #ifndef _UTILITY_H_INCLUDED #define _UTILITY_H_INCLUDED  #include &lt;EGL\/egl.h&gt; #include &lt;screen\/screen.h&gt; #include &lt;sys\/platform.h&gt;  #define USING_GL20  extern EGLDisplay egl_disp; extern EGLSurface egl_surf;  typedef struct font_t font_t;  #define BBUTIL_DEFAULT_FONT &quot;\/usr\/fonts\/font_repository\/monotype\/arial.ttf&quot;  #ifdef __cplusplus extern &quot;C&quot; { #endif  \t\/** \t * Initializes EGL \t * \t * @param libscreen context that will be used for EGL setup \t * @return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE \t *\/ \tint bbutil_init_egl( screen_context_t ctx );  \t\/** \t * Terminates EGL \t *\/ \tvoid bbutil_terminate();  \t\/** \t * Swaps default bbutil window surface to the screen \t *\/ \tvoid bbutil_swap();  \t\/** \t * Returns dpi for a given screen  \t * \t * @param ctx path libscreen context that corresponds to display of interest \t * @return dpi for a given screen \t *\/  \tint bbutil_calculate_dpi( screen_context_t ctx );  \t\/** \t * Rotates the screen to a given angle  \t * \t * @param angle to rotate screen surface to, must by 0, 90, 180, or 270 \t * @return EXIT_SUCCESS if texture loading succeeded otherwise EXIT_FAILURE \t *\/  \tint bbutil_rotate_screen_surface( int angle );  #ifdef __cplusplus } #endif  #endif <\/code><\/pre>\n<pre><code class=\"cpp\">\/*  * Copyright (c) 2011-2012 Research In Motion Limited.  *  * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  * http:\/\/www.apache.org\/licenses\/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  *\/ #include &lt;assert.h&gt; #include &lt;ctype.h&gt; #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;sys\/keycodes.h&gt; #include &lt;time.h&gt; #include &lt;stdbool.h&gt; #include &lt;math.h&gt;  #include &quot;bbutil.h&quot;  #ifdef USING_GL11 #include &lt;GLES\/gl.h&gt; #include &lt;GLES\/glext.h&gt; #elif defined(USING_GL20) #include &lt;GLES2\/gl2.h&gt; #else #error bbutil must be compiled with either USING_GL11 or USING_GL20 flags #endif  EGLDisplay egl_disp; EGLSurface egl_surf;  static EGLConfig egl_conf; static EGLContext egl_ctx;  static screen_context_t screen_ctx; static screen_window_t screen_win; static screen_display_t screen_disp; static int nbuffers = 2; static int initialized = 0;  #ifdef USING_GL20 static GLuint text_rendering_program; static int text_program_initialized = 0; static GLint positionLoc; static GLint texcoordLoc; static GLint textureLoc; static GLint colorLoc; #endif  struct font_t { \tunsigned int font_texture; \tfloat pt; \tfloat advance[128]; \tfloat width[128]; \tfloat height[128]; \tfloat tex_x1[128]; \tfloat tex_x2[128]; \tfloat tex_y1[128]; \tfloat tex_y2[128]; \tfloat offset_x[128]; \tfloat offset_y[128]; \tint initialized; };   static void bbutil_egl_perror( const char* msg ) { \tstatic const char* errmsg[] = \t{ \t\t&quot;function succeeded&quot;, \t\t&quot;EGL is not initialized, or could not be initialized, for the specified display&quot;, \t\t&quot;cannot access a requested resource&quot;, \t\t&quot;failed to allocate resources for the requested operation&quot;, \t\t&quot;an unrecognized attribute or attribute value was passed in an attribute list&quot;, \t\t&quot;an EGLConfig argument does not name a valid EGLConfig&quot;, \t\t&quot;an EGLContext argument does not name a valid EGLContext&quot;, \t\t&quot;the current surface of the calling thread is no longer valid&quot;, \t\t&quot;an EGLDisplay argument does not name a valid EGLDisplay&quot;, \t\t&quot;arguments are inconsistent&quot;, \t\t&quot;an EGLNativePixmapType argument does not refer to a valid native pixmap&quot;, \t\t&quot;an EGLNativeWindowType argument does not refer to a valid native window&quot;, \t\t&quot;one or more argument values are invalid&quot;, \t\t&quot;an EGLSurface argument does not name a valid surface configured for rendering&quot;, \t\t&quot;a power management event has occurred&quot;, \t\t&quot;unknown error code&quot; \t};  \tint message_index = eglGetError() - EGL_SUCCESS;  \tif ( message_index &lt; 0 || message_index &gt; 14 ) \t{ \t\tmessage_index = 15; \t}  \tfprintf( stderr, &quot;%s: %s\\n&quot;, msg, errmsg[message_index] ); }  int bbutil_init_egl( screen_context_t ctx ) { \tint usage; \tint format = SCREEN_FORMAT_RGBX8888; \tEGLint interval = 1; \tint rc, num_configs;  \tEGLint attrib_list[] = { EGL_RED_SIZE,        8, \t                         EGL_GREEN_SIZE,      8, \t                         EGL_BLUE_SIZE,       8, \t                         EGL_SURFACE_TYPE,    EGL_WINDOW_BIT, \t                         EGL_RENDERABLE_TYPE, 0, \t                         EGL_NONE \t                       };  #ifdef USING_GL11 \tusage = SCREEN_USAGE_OPENGL_ES1 | SCREEN_USAGE_ROTATION; \tattrib_list[9] = EGL_OPENGL_ES_BIT; #elif defined(USING_GL20) \tusage = SCREEN_USAGE_OPENGL_ES2 | SCREEN_USAGE_ROTATION; \tattrib_list[9] = EGL_OPENGL_ES2_BIT; \tEGLint attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; #else \tfprintf( stderr, &quot;bbutil should be compiled with either USING_GL11 or USING_GL20 -D flags\\n&quot; ); \treturn EXIT_FAILURE; #endif  \t\/\/Simple egl initialization \tscreen_ctx = ctx;  \tegl_disp = eglGetDisplay( EGL_DEFAULT_DISPLAY );  \tif ( egl_disp == EGL_NO_DISPLAY ) \t{ \t\tbbutil_egl_perror( &quot;eglGetDisplay&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = eglInitialize( egl_disp, NULL, NULL );  \tif ( rc != EGL_TRUE ) \t{ \t\tbbutil_egl_perror( &quot;eglInitialize&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = eglBindAPI( EGL_OPENGL_ES_API );  \tif ( rc != EGL_TRUE ) \t{ \t\tbbutil_egl_perror( &quot;eglBindApi&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tif ( !eglChooseConfig( egl_disp, attrib_list, &egl_conf, 1, &num_configs ) ) \t{ \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  #ifdef USING_GL20 \tegl_ctx = eglCreateContext( egl_disp, egl_conf, EGL_NO_CONTEXT, attributes ); #elif defined(USING_GL11) \tegl_ctx = eglCreateContext( egl_disp, egl_conf, EGL_NO_CONTEXT, NULL ); #endif  \tif ( egl_ctx == EGL_NO_CONTEXT ) \t{ \t\tbbutil_egl_perror( &quot;eglCreateContext&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_create_window( &screen_win, screen_ctx );  \tif ( rc ) \t{ \t\tperror( &quot;screen_create_window&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_FORMAT, &format );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv(SCREEN_PROPERTY_FORMAT)&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_USAGE, &usage );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv(SCREEN_PROPERTY_USAGE)&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_get_window_property_pv( screen_win, SCREEN_PROPERTY_DISPLAY, ( void** )&screen_disp );  \tif ( rc ) \t{ \t\tperror( &quot;screen_get_window_property_pv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tint screen_resolution[2];  \trc = screen_get_display_property_iv( screen_disp, SCREEN_PROPERTY_SIZE, screen_resolution );  \tif ( rc ) \t{ \t\tperror( &quot;screen_get_display_property_iv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tint angle = atoi( getenv( &quot;ORIENTATION&quot; ) );  \tscreen_display_mode_t screen_mode; \trc = screen_get_display_property_pv( screen_disp, SCREEN_PROPERTY_MODE, ( void** )&screen_mode );  \tif ( rc ) \t{ \t\tperror( &quot;screen_get_display_property_pv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tint size[2]; \trc = screen_get_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size );  \tif ( rc ) \t{ \t\tperror( &quot;screen_get_window_property_iv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tint buffer_size[2] = {size[0], size[1]};  \tif ( ( angle == 0 ) || ( angle == 180 ) ) \t{ \t\tif ( ( ( screen_mode.width &gt; screen_mode.height ) && ( size[0] &lt; size[1] ) ) || \t\t     ( ( screen_mode.width &lt; screen_mode.height ) && ( size[0] &gt; size[1] ) ) ) \t\t{ \t\t\tbuffer_size[1] = size[0]; \t\t\tbuffer_size[0] = size[1]; \t\t} \t} \telse if ( ( angle == 90 ) || ( angle == 270 ) ) \t{ \t\tif ( ( ( screen_mode.width &gt; screen_mode.height ) && ( size[0] &gt; size[1] ) ) || \t\t     ( ( screen_mode.width &lt; screen_mode.height && size[0] &lt; size[1] ) ) ) \t\t{ \t\t\tbuffer_size[1] = size[0]; \t\t\tbuffer_size[0] = size[1]; \t\t} \t} \telse \t{ \t\tfprintf( stderr, &quot;Navigator returned an unexpected orientation angle.\\n&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, buffer_size );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_ROTATION, &angle );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = screen_create_window_buffers( screen_win, nbuffers );  \tif ( rc ) \t{ \t\tperror( &quot;screen_create_window_buffers&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tegl_surf = eglCreateWindowSurface( egl_disp, egl_conf, screen_win, NULL );  \tif ( egl_surf == EGL_NO_SURFACE ) \t{ \t\tbbutil_egl_perror( &quot;eglCreateWindowSurface&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = eglMakeCurrent( egl_disp, egl_surf, egl_surf, egl_ctx );  \tif ( rc != EGL_TRUE ) \t{ \t\tbbutil_egl_perror( &quot;eglMakeCurrent&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \trc = eglSwapInterval( egl_disp, interval );  \tif ( rc != EGL_TRUE ) \t{ \t\tbbutil_egl_perror( &quot;eglSwapInterval&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \tinitialized = 1;  \treturn EXIT_SUCCESS; }  void bbutil_terminate() { \t\/\/Typical EGL cleanup \tif ( egl_disp != EGL_NO_DISPLAY ) \t{ \t\teglMakeCurrent( egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );  \t\tif ( egl_surf != EGL_NO_SURFACE ) \t\t{ \t\t\teglDestroySurface( egl_disp, egl_surf ); \t\t\tegl_surf = EGL_NO_SURFACE; \t\t}  \t\tif ( egl_ctx != EGL_NO_CONTEXT ) \t\t{ \t\t\teglDestroyContext( egl_disp, egl_ctx ); \t\t\tegl_ctx = EGL_NO_CONTEXT; \t\t}  \t\tif ( screen_win != NULL ) \t\t{ \t\t\tscreen_destroy_window( screen_win ); \t\t\tscreen_win = NULL; \t\t}  \t\teglTerminate( egl_disp ); \t\tegl_disp = EGL_NO_DISPLAY; \t}  \teglReleaseThread();  \tinitialized = 0; }  void bbutil_swap() { \tint rc = eglSwapBuffers( egl_disp, egl_surf );  \tif ( rc != EGL_TRUE ) \t{ \t\tbbutil_egl_perror( &quot;eglSwapBuffers&quot; ); \t} }  \/* Finds the next power of 2 *\/ static inline int nextp2( int x ) { \tint val = 1;  \twhile ( val &lt; x ) { val &lt;&lt;= 1; }  \treturn val; }  int bbutil_calculate_dpi( screen_context_t ctx ) { \tint rc; \tint screen_phys_size[2];  \trc = screen_get_display_property_iv( screen_disp, SCREEN_PROPERTY_PHYSICAL_SIZE, screen_phys_size );  \tif ( rc ) \t{ \t\tperror( &quot;screen_get_display_property_iv&quot; ); \t\tbbutil_terminate(); \t\treturn EXIT_FAILURE; \t}  \t\/\/Simulator will return 0,0 for physical size of the screen, so use 170 as default dpi \tif ( ( screen_phys_size[0] == 0 ) && ( screen_phys_size[1] == 0 ) ) \t{ \t\treturn 170; \t} \telse \t{ \t\tint screen_resolution[2]; \t\trc = screen_get_display_property_iv( screen_disp, SCREEN_PROPERTY_SIZE, screen_resolution );  \t\tif ( rc ) \t\t{ \t\t\tperror( &quot;screen_get_display_property_iv&quot; ); \t\t\tbbutil_terminate(); \t\t\treturn EXIT_FAILURE; \t\t}  \t\tdouble diagonal_pixels = sqrt( screen_resolution[0] * screen_resolution[0] + screen_resolution[1] * screen_resolution[1] ); \t\tdouble diagonal_inches = 0.0393700787 * sqrt( screen_phys_size[0] * screen_phys_size[0] + screen_phys_size[1] * screen_phys_size[1] ); \t\treturn ( int )( diagonal_pixels \/ diagonal_inches + 0.5 );  \t} }  int bbutil_rotate_screen_surface( int angle ) { \tint rc, rotation, skip = 1, temp;; \tEGLint interval = 1; \tint size[2];  \tif ( ( angle != 0 ) && ( angle != 90 ) && ( angle != 180 ) && ( angle != 270 ) ) \t{ \t\tfprintf( stderr, &quot;Invalid angle\\n&quot; ); \t\treturn EXIT_FAILURE; \t}  \trc = screen_get_window_property_iv( screen_win, SCREEN_PROPERTY_ROTATION, &rotation );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\treturn EXIT_FAILURE; \t}  \trc = screen_get_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\treturn EXIT_FAILURE; \t}  \tswitch ( angle - rotation ) \t{ \t\tcase -270: \t\tcase -90: \t\tcase 90: \t\tcase 270: \t\t\ttemp = size[0]; \t\t\tsize[0] = size[1]; \t\t\tsize[1] = temp; \t\t\tskip = 0; \t\t\tbreak; \t}  \tif ( !skip ) \t{ \t\trc = eglMakeCurrent( egl_disp, NULL, NULL, NULL );  \t\tif ( rc != EGL_TRUE ) \t\t{ \t\t\tbbutil_egl_perror( &quot;eglMakeCurrent&quot; ); \t\t\treturn EXIT_FAILURE; \t\t}  \t\trc = eglDestroySurface( egl_disp, egl_surf );  \t\tif ( rc != EGL_TRUE ) \t\t{ \t\t\tbbutil_egl_perror( &quot;eglMakeCurrent&quot; ); \t\t\treturn EXIT_FAILURE; \t\t}  \t\trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_SOURCE_SIZE, size );  \t\tif ( rc ) \t\t{ \t\t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\t\treturn EXIT_FAILURE; \t\t}  \t\trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size );  \t\tif ( rc ) \t\t{ \t\t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\t\treturn EXIT_FAILURE; \t\t}  \t\tegl_surf = eglCreateWindowSurface( egl_disp, egl_conf, screen_win, NULL );  \t\tif ( egl_surf == EGL_NO_SURFACE ) \t\t{ \t\t\tbbutil_egl_perror( &quot;eglCreateWindowSurface&quot; ); \t\t\treturn EXIT_FAILURE; \t\t}  \t\trc = eglMakeCurrent( egl_disp, egl_surf, egl_surf, egl_ctx );  \t\tif ( rc != EGL_TRUE ) \t\t{ \t\t\tbbutil_egl_perror( &quot;eglMakeCurrent&quot; ); \t\t\treturn EXIT_FAILURE; \t\t}  \t\trc = eglSwapInterval( egl_disp, interval );  \t\tif ( rc != EGL_TRUE ) \t\t{ \t\t\tbbutil_egl_perror( &quot;eglSwapInterval&quot; ); \t\t\treturn EXIT_FAILURE; \t\t} \t}  \trc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_ROTATION, &angle );  \tif ( rc ) \t{ \t\tperror( &quot;screen_set_window_property_iv&quot; ); \t\treturn EXIT_FAILURE; \t}  \treturn EXIT_SUCCESS; } <\/code><\/pre>\n<h4>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h4>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 \u0443 BlackBerry 10 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f QNX \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0434 \u043d\u0435\u0451 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e gcc. \u041d\u0430\u043f\u0438\u0448\u0435\u043c <b>makefile<\/b>:<\/p>\n<pre><code class=\"bash\">BBARCH=x86 CC  = i486-pc-nto-qnx8.0.0-gcc.exe CXX = i486-pc-nto-qnx8.0.0-gcc.exe AR  = i486-pc-nto-qnx8.0.0-ar.exe  OBJDIR=out OUTDIR=out  OBJS = $(OBJDIR)\/main.o $(OBJDIR)\/bbutil.o  $(OBJDIR)\/bbutil.o: bbutil.c bbutil.h \t$(CC) -c bbutil.c -o $(OBJDIR)\/bbutil.o $(CFLAGS)  $(OBJDIR)\/main.o: main.cpp \t$(CXX) -c main.cpp -o $(OBJDIR)\/main.o $(CFLAGS) $(CPPFLAGS)  OBJS += $(OBJDIR)\/bbutil.o $(OBJDIR)\/main.o  USEDLIBS = -lstdc++ -lbps -lscreen -lm -lEGL -lGLESv2 -lfreetype -lsocket -lcurl -lOpenAL CFLAGS   = -m32 -fomit-frame-pointer CPPFLAGS = -std=gnu++0x -fpermissive  PACK: $(OBJS) \trm -f $(OBJDIR)\/pack.a \tar -ru $(OBJDIR)\/pack.a $(OBJS)  all: $(OBJS) PACK \t$(CXX) $(CFLAGS) $(CPPFLAGS) -o Main.exe-$(BBARCH) main.cpp $(OBJDIR)\/pack.a $(USEDLIBS) <\/code><\/pre>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 <b>out<\/b> \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043f\u0430\u043d\u0434\u043e\u0439 make all, \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f BlackBerry 10 Native SDK \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (\u0434\u0435\u0432\u0430\u0439\u0441 \u043d\u0430 arm \u0438 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 x86), \u0442\u043e \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443. \u0412\u043e\u0442 <b>make-x86.py<\/b>:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/python import os Target = &quot;M:\/BBNDK\/target_10_0_9_1673\/qnx6&quot; Host   = &quot;M:\/BBNDK\/host_10_0_9_404\/win32\/x86&quot; os.environ['QNX_TARGET'] = Target os.environ['QNX_HOST'  ] = Host os.environ['PATH'      ] = Host + &quot;\/usr\/bin;&quot; + os.environ['PATH'] os.system( &quot;make all&quot; ) <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <b>make-x86.py<\/b> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a <b>Main.exe-x86<\/b>. <\/p>\n<h4>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442, \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u0439 \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043d\u0430 BlackBerry 10. \u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 <b>bar-descriptor-x86.xml<\/b><\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; standalone=&quot;no&quot;?&gt; &lt;qnx xmlns=&quot;http:\/\/www.qnx.com\/schemas\/application\/1.0&quot;&gt;     &lt;id&gt;com.linderdaum.test_app&lt;\/id&gt;     &lt;name&gt;Test App&lt;\/name&gt;     &lt;versionNumber&gt;1.0.0&lt;\/versionNumber&gt;     &lt;buildId&gt;1&lt;\/buildId&gt;     &lt;description&gt;Test App&lt;\/description&gt;     &lt;author&gt;Linderdaum&lt;\/author&gt;     &lt;platformVersion&gt;10.0.9.1673&lt;\/platformVersion&gt;     &lt;initialWindow&gt;         &lt;systemChrome&gt;none&lt;\/systemChrome&gt;         &lt;transparent&gt;false&lt;\/transparent&gt;         &lt;aspectRatio&gt;landscape&lt;\/aspectRatio&gt;         &lt;autoOrients&gt;false&lt;\/autoOrients&gt;     &lt;\/initialWindow&gt;     &lt;category&gt;core.games&lt;\/category&gt;     &lt;asset path=&quot;BB10Res\/icon.png&quot;&gt;icon.png&lt;\/asset&gt;     &lt;configuration id=&quot;com.qnx.qcc.toolChain.1246487324&quot; name=&quot;Simulator-Debug&quot;&gt;        &lt;platformArchitecture&gt;x86&lt;\/platformArchitecture&gt;        &lt;asset path=&quot;Main.exe-x86&quot; entry=&quot;true&quot; type=&quot;Qnx\/Elf&quot;&gt;Main.exe-x86&lt;\/asset&gt;     &lt;\/configuration&gt;     &lt;icon&gt;        &lt;image&gt;icon.png&lt;\/image&gt;     &lt;\/icon&gt;     &lt;permission system=&quot;true&quot;&gt;run_native&lt;\/permission&gt;     &lt;env var=&quot;LD_LIBRARY_PATH&quot; value=&quot;app\/native\/lib&quot;\/&gt; &lt;\/qnx&gt; <\/code><\/pre>\n<p>  \u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443 \u0432 <b>BB10Res\/icon.png<\/b>. \u0423 \u043c\u0435\u043d\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f 150&#215;150: <br \/>  <a href=\"http:\/\/play.google.com\/store\/apps\/details?id=com.linderdaum.engine.puzzL\"><img decoding=\"async\" src=\"http:\/\/www.linderdaum.com\/Puzzle\/icon.png\" alt=\"image\"\/><\/a><\/p>\n<p>  \u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u0432 Main-x86.bar:<\/p>\n<pre><code class=\"bash\">blackberry-nativepackager -devMode -package Main-x86.bar bar-descriptor-x86.xml <\/code><\/pre>\n<h4>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a<\/h4>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440:<\/p>\n<pre><code class=\"bash\">blackberry-deploy -installApp -device 192.168.70.130 Main-x86.bar <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/www.linderdaum.com\/Puzzle\/bb10_shot1.png\" alt=\"image\"\/><\/p>\n<p>  \u0418 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/www.linderdaum.com\/Puzzle\/bb10_shot2.png\" alt=\"image\"\/><\/p>\n<p>  <b>P.S.<\/b> \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 <a href=\"http:\/\/appworld.blackberry.com\">BlackBerry App World<\/a>, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c. \u0418\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"bash\">blackberry-signer -storepass &lt;\u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438&gt; Main-armv7.bar <\/code><\/pre>\n<p>  <b>P.P.S.<\/b> \u0421\u043e\u0440\u0440\u0438, \u0447\u0442\u043e \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0417\u0430\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043e\u043f\u0438-\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0451 \u044d\u0442\u043e \u0438 \u0437\u0430 15 \u043c\u0438\u043d\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.    \t \t\t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/165523\/\"> http:\/\/habrahabr.ru\/post\/165523\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041f\u043e\u0434 BlackBerry OS 10 \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438: QNX Momentics IDE, \u043d\u0430 \u0431\u0430\u0437\u0435 Eclipse. \u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u043e \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0438\u043b\u0434\u043e\u0432, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0438\u043b\u0434-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 TeamCity, \u0442\u043e IDE \u043d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a \u0441\u043e\u0431\u0430\u043a\u0435 \u043f\u044f\u0442\u0430\u044f \u043d\u043e\u0433\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043f\u0440\u0438 \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e <a href=\"http:\/\/www.linderdaum.com\">\u0434\u0432\u0438\u0436\u043a\u0430<\/a> \u043d\u0430 BlackBerry. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0451\u043c\u0441\u044f, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u2014 \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f IDE.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-165523","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/165523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=165523"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/165523\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=165523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=165523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=165523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}