Перейти к содержанию
Fire Monkey от А до Я
  • 0

Ошибка при подключении *.pas файла.


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;
[ld Warning] ld: symbol(s) not found for architecture armv7

Изменено пользователем Kitty
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Если взять отсюда два файла:

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
  • Модераторы

незнаю в чем проблема, но попробуй убрать лишние uses

там нужен только 

uses
  Macapi.CoreFoundation;

 

Ссылка на комментарий
  • 0
  • Модераторы
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
  • Модераторы

возможно вот этого не хватает?

Цитата

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

 

Ссылка на комментарий
  • 0
Цитата

незнаю в чем проблема, но попробуй убрать лишние uses

Ошибка осталась

Цитата

(copy and paste the path from one of the other frameword records)

А можно чуть подробнее что именно тут вписать?

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Kitty сказал:

А можно чуть подробнее что именно тут вписать?

Скопировать путь из других записей и Framework Name написать AudioToolbox

Ссылка на комментарий
  • 0

А вот еще попробовал рекомендацию 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.

 

Изменено пользователем Kitty
Ссылка на комментарий
  • 0
  • Модераторы
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

Вот, что в том файле:

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
  • Модераторы

вообще модуль UVibrate.pas содержит все необходимое, iOSapi.AudioToolbox.pas не нужно подключать

на Delphi проблем не было при компиляции. запустил на симуляторе, но там нет возможности проверить вибрацию

Ссылка на комментарий
  • 0

Не правильно добавляла путь. Надо так:

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

 

 

Ссылка на комментарий
  • 0

Еще такой вариант попробовала как на картинке, но теперь уже с другой ошибкой:

[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

 

123.jpg

Ссылка на комментарий
  • 0
  • Администраторы
[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. 

Ваши действия такие. Когда среда собирает ваш проект, она подставляет на вход линковщику либы, прописанные в профиле сдк для текущей платформы. Там обязательно должен быть внешние либы, которые вы собираете использовать. Проверить, что либы, которые скачены па сервером на ваш компьютер актуальны и соответствуют требуемой архитектуре.

Проверить пока сам не могу. Нету под рукой йос стенда.

Ссылка на комментарий
  • 0
Цитата

Проверить, что либы, которые скачены па сервером на ваш компьютер актуальны и соответствуют требуемой архитектуре.

Подскажите, пожалуйста, поподробнее какова последовательность действий такой проверки. Где и как смотреть либы и архитектуру? Спасибо.

Ссылка на комментарий
  • 1

Удалось получить вибрацию на С++ 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();
}

pic.jpg

Изменено пользователем Kitty
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...