Перейти к содержанию
  • Регистрация
  • 0
Kitty

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

Вопрос

На основании сылки *.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
Цитата

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

Все перепробовала.

[ld Error] ld: framework not found AudioToolbox

 

Изменено пользователем Kitty

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 пользователей онлайн

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

×
×
  • Создать...