Kitty Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 (изменено) На основании сылки *.pas файл подключаю к проекту: http://community.embarcadero.com/blogs/entry/how-to-vibrate-ios-and-android-phones-using-firemonkey-and-xe8 unit UVibrate; interface procedure Vibrate; implementation {$IFDEF ANDROID} uses Androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, Androidapi.JNIBridge; {$ENDIF} {$IFDEF IOS} uses IOSapi.MediaPlayer, IOSapi.CoreGraphics, FMX.Platform, FMX.Platform.IOS, IOSapi.UIKit, Macapi.ObjCRuntime, Macapi.ObjectiveC, iOSapi.Cocoatypes, Macapi.CoreFoundation, iOSapi.Foundation, iOSapi.CoreImage, iOSapi.QuartzCore, iOSapi.CoreData; {$ENDIF} {$IFDEF IOS} const libAudioToolbox = '/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox'; kSystemSoundID_vibrate = $FFF; procedure AudioServicesPlaySystemSound( inSystemSoundID: integer ); cdecl; External libAudioToolbox Name _PU + 'AudioServicesPlaySystemSound'; {$ENDIF} procedure Vibrate; {$IFDEF ANDROID} var Vibrator: JVibrator; {$ENDIF} begin {$IFDEF ANDROID} Vibrator := TJVibrator.Wrap((SharedActivityContext.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID); // Vibrate for 500 milliseconds Vibrator.vibrate(500); {$ENDIF} {$IFDEF IOS} AudioServicesPlaySystemSound( kSystemSoundID_vibrate ); {$ENDIF} end; end. Подключаю этот *.pas к проекту C++ и компилирую. Полученный hpp файл включаю в проект: #include "UVibrate.hpp" #include "Unit1.h" //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Vibrate(); } Теперь ошибка, которую не знаю как исправить. Может кто знает? [ld Error] Error: "_AudioServicesPlaySystemSound", referenced from: __ZN8Uvibrate28AudioServicesPlaySystemSoundEi in .\ \iOSDevice32\ \Debug\ \UVibrate.o; [ld Warning] ld: symbol(s) not found for architecture armv7 Изменено 15 октября, 2016 пользователем Kitty Цитата Ссылка на комментарий
0 Kitty Опубликовано 15 октября, 2016 Автор Поделиться Опубликовано 15 октября, 2016 Если взять отсюда два файла: https://github.com/EmbarcaderoPublic/CppArcadeGames/blob/master/Classic/AlienInvasionClassic/AudioManager.cpp Добавить срр в проект: #include <fmx.h> #pragma hdrstop #include "Unit1.h" #include "AudioManager.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //C++ Builder не понимает константу kSystemSoundID_Vibrate AudioServicesPlaySystemSound(1); } //--------------------------------------------------------------------------- И результат: [ld Error] Error: "_AudioServicesPlaySystemSound", referenced from: __ZN6TForm112Button1ClickEPN6System7TObjectE in .\\iOSDevice32\\Debug\\Unit1.o; [ld Warning] ld: symbol(s) not found for architecture armv7 Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 15 октября, 2016 Модераторы Поделиться Опубликовано 15 октября, 2016 незнаю в чем проблема, но попробуй убрать лишние uses там нужен только uses Macapi.CoreFoundation; Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 15 октября, 2016 Модераторы Поделиться Опубликовано 15 октября, 2016 1 час назад, Kitty сказал: Если взять отсюда два файла: https://github.com/EmbarcaderoPublic/CppArcadeGames/blob/master/Classic/AlienInvasionClassic/AudioManager.cpp Добавить срр в проект: #include <fmx.h> #pragma hdrstop #include "Unit1.h" #include "AudioManager.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //C++ Builder не понимает константу kSystemSoundID_Vibrate AudioServicesPlaySystemSound(1); } //--------------------------------------------------------------------------- И результат: [ld Error] Error: "_AudioServicesPlaySystemSound", referenced from: __ZN6TForm112Button1ClickEPN6System7TObjectE in .\\iOSDevice32\\Debug\\Unit1.o; [ld Warning] ld: symbol(s) not found for architecture armv7 судя по коду, это вообще другое. тут нужно свой файлы добавить в список и с него проиграть Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 15 октября, 2016 Модераторы Поделиться Опубликовано 15 октября, 2016 возможно вот этого не хватает? Цитата Compiling For IOS in the IDE click Tools|Options|Environment Options|SDK Manager|IOS Device - 64 bit|iPhone OS 9.3|Remote Paths|Frameworks Select a framework row at the bottom of the list|Add a New Path Item|Path on remote machine: (copy and paste the path from one of the other frameword records) Framework Name: AudioToolbox Update Local File Cach Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 16 октября, 2016 Автор Поделиться Опубликовано 16 октября, 2016 Цитата незнаю в чем проблема, но попробуй убрать лишние uses Ошибка осталась Цитата (copy and paste the path from one of the other frameword records) А можно чуть подробнее что именно тут вписать? Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 16 октября, 2016 Модераторы Поделиться Опубликовано 16 октября, 2016 2 минуты назад, Kitty сказал: А можно чуть подробнее что именно тут вписать? Скопировать путь из других записей и Framework Name написать AudioToolbox Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 16 октября, 2016 Автор Поделиться Опубликовано 16 октября, 2016 (изменено) А вот еще попробовал рекомендацию ZuBy и взяла файл iOSapi.AudioToolbox.pas по его ссылке: https://github.com/FMXExpress/ios-object-pascal-wrapper Добавила в проект и пробовала получить hpp, но ошибка: [DCC Fatal Error] iOSapi.AudioToolbox.pas(22): F2613 Unit 'Macapi.Foundation' not found. Изменено 16 октября, 2016 пользователем Kitty Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 16 октября, 2016 Модераторы Поделиться Опубликовано 16 октября, 2016 54 минуты назад, Kitty сказал: А вот еще попробовал рекомендацию ZuBy и взяла файл iOSapi.AudioToolbox.pas по его ссылке: https://github.com/FMXExpress/ios-object-pascal-wrapper Добавила в проект и пробовала получить hpp, но ошибка: [DCC Fatal Error] iOSapi.AudioToolbox.pas(22): F2613 Unit 'Macapi.Foundation' not found. uses Macapi.CoreFoundation; Цитата Ссылка на комментарий
0 Kitty Опубликовано 16 октября, 2016 Автор Поделиться Опубликовано 16 октября, 2016 Вот, что в том файле: uses Macapi.CoreFoundation, Macapi.CoreServices, Macapi.Dispatch, Macapi.Foundation, Macapi.Mach, Macapi.ObjCRuntime, Macapi.ObjectiveC, Macapi.QuartzCore, iOSapi.AudioUnit, iOSapi.CocoaTypes, iOSapi.CoreAudio, iOSapi.CoreMIDI, iOSapi.Foundation; Дополнительно к файлу iOSapi.AudioToolbox.pas скопировала в папку с проектом еще два файла: iOSapi.CoreFoundation.pas iOSapi.Foundation.pas [DCC Fatal Error] iOSapi.AudioToolbox.pas(22): F2613 Unit 'Macapi.Foundation' not found. Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 16 октября, 2016 Модераторы Поделиться Опубликовано 16 октября, 2016 вообще модуль UVibrate.pas содержит все необходимое, iOSapi.AudioToolbox.pas не нужно подключать на Delphi проблем не было при компиляции. запустил на симуляторе, но там нет возможности проверить вибрацию Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 16 октября, 2016 Автор Поделиться Опубликовано 16 октября, 2016 (изменено) Цитата (copy and paste the path from one of the other frameword records) Все перепробовала. [ld Error] ld: framework not found AudioToolbox Изменено 17 октября, 2016 пользователем Kitty Цитата Ссылка на комментарий
0 Kitty Опубликовано 17 октября, 2016 Автор Поделиться Опубликовано 17 октября, 2016 Не правильно добавляла путь. Надо так: Tools->Options->SDK Manager->click Add the new path item path on remote machine : /System/Library/Frameworks/AudioToolbox.framework File masks: * path type: Other path include subdirectories: unchecked Источник: https://forums.embarcadero.com/thread.jspa?threadID=88902 Однако избавиться от ошибки при компиляции так и не удалось: [ld Error] Error: "_AudioServicesPlaySystemSound", referenced from: __ZN8Uvibrate28AudioServicesPlaySystemSoundEi in .\\iOSDevice32\\Debug\\UVibrate.o; [ld Warning] ld: symbol(s) not found for architecture armv7 Brovin Yaroslav 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 17 октября, 2016 Автор Поделиться Опубликовано 17 октября, 2016 Еще такой вариант попробовала как на картинке, но теперь уже с другой ошибкой: [ld Error] ld: file was built for i386 which is not the architecture being linked (armv7): C:\Users\Lena\Documents\Embarcadero\Studio\SDKs\iPhoneOS10.0.sdk\System\Library\Frameworks/AudioToolbox.framework/AudioToolbox for architecture armv7 Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 17 октября, 2016 Администраторы Поделиться Опубликовано 17 октября, 2016 [ld Warning] ld: symbol(s) not found for architecture armv7 Суть ошибки в том, что на этапе линкования вашего модуля и апи, который там написан, с внешней библиотекой, линкеру не удается найти нужный метод в сторонней либе. [ld Error] ld: file was built for i386 which is not the architecture being linked (armv7): Это значит, что линковщик нашел метод в сторонней либе, НО либа собрана для другой платформы/архитектуры. В данном сообщение, файл от десктопных систем, а вы собираетесь его использовать в мобильных процессорах armv7. Ваши действия такие. Когда среда собирает ваш проект, она подставляет на вход линковщику либы, прописанные в профиле сдк для текущей платформы. Там обязательно должен быть внешние либы, которые вы собираете использовать. Проверить, что либы, которые скачены па сервером на ваш компьютер актуальны и соответствуют требуемой архитектуре. Проверить пока сам не могу. Нету под рукой йос стенда. Kitty и Равиль Зарипов (ZuBy) 2 Цитата Ссылка на комментарий
0 Kitty Опубликовано 17 октября, 2016 Автор Поделиться Опубликовано 17 октября, 2016 Цитата Проверить, что либы, которые скачены па сервером на ваш компьютер актуальны и соответствуют требуемой архитектуре. Подскажите, пожалуйста, поподробнее какова последовательность действий такой проверки. Где и как смотреть либы и архитектуру? Спасибо. Цитата Ссылка на комментарий
1 Kitty Опубликовано 17 октября, 2016 Автор Поделиться Опубликовано 17 октября, 2016 (изменено) Удалось получить вибрацию на С++ Builder. Вот такие настройки путей оказались правильными. Просто перебором вариантов нашла такое решение. При этом возникло диалоговое окно, что есть более новая версия файла AudioToolbox. Я согласилась с заменой. Компиляция проекта прошла успешно. Вибро сработало. #include <fmx.h> #pragma hdrstop #include "UVibrate.hpp" <-- на основании *.pas в этой теме #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Vibrate(); } Изменено 17 октября, 2016 пользователем Kitty Евгений Корепов и Равиль Зарипов (ZuBy) 2 Цитата Ссылка на комментарий
Вопрос
Kitty
На основании сылки *.pas файл подключаю к проекту:
http://community.embarcadero.com/blogs/entry/how-to-vibrate-ios-and-android-phones-using-firemonkey-and-xe8
unit UVibrate; interface procedure Vibrate; implementation {$IFDEF ANDROID} uses Androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, Androidapi.JNIBridge; {$ENDIF} {$IFDEF IOS} uses IOSapi.MediaPlayer, IOSapi.CoreGraphics, FMX.Platform, FMX.Platform.IOS, IOSapi.UIKit, Macapi.ObjCRuntime, Macapi.ObjectiveC, iOSapi.Cocoatypes, Macapi.CoreFoundation, iOSapi.Foundation, iOSapi.CoreImage, iOSapi.QuartzCore, iOSapi.CoreData; {$ENDIF} {$IFDEF IOS} const libAudioToolbox = '/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox'; kSystemSoundID_vibrate = $FFF; procedure AudioServicesPlaySystemSound( inSystemSoundID: integer ); cdecl; External libAudioToolbox Name _PU + 'AudioServicesPlaySystemSound'; {$ENDIF} procedure Vibrate; {$IFDEF ANDROID} var Vibrator: JVibrator; {$ENDIF} begin {$IFDEF ANDROID} Vibrator := TJVibrator.Wrap((SharedActivityContext.getSystemService(TJContext.JavaClass.VIBRATOR_SERVICE) as ILocalObject).GetObjectID); // Vibrate for 500 milliseconds Vibrator.vibrate(500); {$ENDIF} {$IFDEF IOS} AudioServicesPlaySystemSound( kSystemSoundID_vibrate ); {$ENDIF} end; end.
Подключаю этот *.pas к проекту C++ и компилирую. Полученный hpp файл включаю в проект:
#include "UVibrate.hpp" #include "Unit1.h" //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Vibrate(); }
Теперь ошибка, которую не знаю как исправить. Может кто знает?
[ld Error] Error: "_AudioServicesPlaySystemSound", referenced from: __ZN8Uvibrate28AudioServicesPlaySystemSoundEi in .\ \iOSDevice32\ \Debug\ \UVibrate.o;
Изменено пользователем Kitty[ld Warning] ld: symbol(s) not found for architecture armv7
Ссылка на комментарий
16 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.