Есть ли шаблон для создания файла.so, который может быть загружен другим файлом delphi ape - я попытался запустить проект пустой обезьяны огня и сменить программу на библиотеку и создать ее, но файл.so, который он создает, не будет загружаться с помощью dlopen в рамках другого проекта delphi. Я прочитал, что в других средах разработки есть параметр islibrary. Я догадываюсь, что более важно то, что есть пример.so библиотека, построенная с огненной обезьяной - я нашел ссылку на голые кости без обезьяны огня, но использует только jni not androidapi.jni - спасибо
могут быть полезны следующие коды.
//-- Code for libMylib.so (MyLib.dproj) ---
library MyLib;
// uses SysUtils;
function GetSum(a, b: integer ) : integer; cdecl;
begin
Result := a + b;
end;
exports
GetSum name 'GetSum';
begin
end.
//-- Code for using libMylib.so (TestMyLib.dproj) ---
var
DocDir, LibFN: string;
GetSum: function(a, b: integer ) : integer; cdecl;
hLib: HMODULE;
begin
DocDir := IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetLibrary'enter code here'Path);
LibFN:=DocDir + 'libMyLib.so';
hLib := LoadLibrary(LibFN); //ERROR (Segmentation fault (11))
if hLib<>0 then
begin
GetSum := GetProcAddress(hLib, 'GetSum');//It works
ShowMessage(IntToStr(GetSum(3, 8)));//It works
end;
end;
PS: вы должны добавить скомпилированный файл libMyLib.so для развертывания TestMyLib.dproj.
P.S2: он дает ошибку при выполнении "LoadLibrary", но работает.
Я не мог найти решение. Вероятно, это связано с параметрами компилятора/компоновщика MyLib.dproj. Потому что, когда я тестирую другой файл.so, который скомпилирован с C++, при вызове LoadLibrary проблем не возникает.
Если вы запустите пустой проект Firemonkey и измените Unit на Library, вы получите эту ошибку компилятора:
[DCC Error] myfunnylib.pas(1): E2029 "UNIT" ожидается, но "БИБЛИОТЕКА" найдена
Попытка добавить существующий проект библиотеки к группе проектов будет отделять этот проект от остальной части сборки и назначать ей уникальные цели сборки и платформы. Который оставит вас с настройками для компиляции для Windows и OS X.
Единственный способ, о котором я до сих пор слышал, - предварительно скомпилировать вашу библиотеку с другим компилятором. FPC упоминается в другом месте. Я еще не пробовал это, но его следующий в списке.
http://wiki.freepascal.org/Android
Не смущайтесь тем фактом, что каждое приложение для Android на самом деле является общим объектом с расширением .so (для общего объекта). Однако это не то же самое, что разделяемая библиотека. Поскольку библиотека экспортирует свои функции, пока приложение не работает. Для компилятора это довольно большая разница, хотя вы не увидите этого, посмотрев расширение файла (но его префикс lib вместо этого).
Если вы ограничите свой вопрос XE и Firemonkey, мое единственное предложение здесь - посмотреть на службы Android. Связанная локальная служба может предложить аналогичные возможности, которые вы ожидаете от библиотеки:
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Android_Service
Также важно отметить, что Android N не позволит динамической компоновке больше, поэтому многие из методов, которые вы найдете в другом месте в качестве решения, не будут работать.
Пример кода suat dmk в ответе ниже, хотя и опротестован, вводит в заблуждение.
Он не может быть скомпилирован для Android или iOS в XE 10.1 или любом из его предшественников.
ОБНОВИТЬ:
Там определенное выражение сотрудников Embarcadero по этому вопросу.
Для объяснения вопроса потребовалось немного терпения, но ответ достаточно ясен:
[..] хочет, чтобы у Delphi был тип проекта общей библиотеки (.so),
в этом случае он прав, у Дельфи это не сейчас. [..]
quod erat demonstrandum
Следовательно, такого шаблона не может быть. Также отвечает на этот вопрос.