2014-02-05 2 views
1

У меня есть трудное время, чтобы загрузить и использовать скомпилированную .so библиотеку в приложении firemonkey. Мне удалось настроить проект таким образом, что он компилируется, а библиотека поставляется в apk, но не может загрузить его при запуске приложения. Является ли system.LoadLibrary() достаточно или мне нужна оболочка java для lib?Как использовать стороннюю библиотеку на Android?

Редактировать: мой код выглядит так как сейчас, но не может пройти стадию загрузки библиотеки. TPath.GetLibraryPath возвращает правильный путь к где библиотека находится (я проверил с ADB тянуть)

{$IFDEF MSWINDOWS} 
    LIBNAME = 'sunvox.dll'; 
{$ENDIF} 
{$IFDEF ANDROID} 
    LIBNAME = 'libsunvox.so'; 
{$ENDIF} 

function sv_load_dll:integer; 
var libPath:system.string; 
begin 
    g_sv_dll:= 0 ; 
    libPath:=TPath.Combine(tpath.GetLibraryPath,libname); 
    {$IFDEF ANDROID} 
    g_sv_dll:=dlopen(MarshaledAString(libPath), RTLD_LAZY); 
    {$ENDIF} 
    {$IFDEF MSWINDOWS} 
    g_sv_dll := LoadLibrary(MarshaledString(libPath)); 
    {$ENDIF} 
    result:=g_sv_dll; 
    if(g_sv_dll = 0)then exit; 

    sv_audio_callback:=tsv_audio_callback(import('sv_audio_callback')); 
... 
end; 
+0

Может быть, вы могли бы показать урезанную версию того, что вы в настоящее время –

ответ

1

Вы можете статически связать с экспортируемой функцией .so файла, используя стандартный синтаксис external Delphi на объявлении функции, указав файл .so в качестве внешней библиотеки.

Или вы можете динамически загружать .so в память самостоятельно, используя функцию dlopen(), получить указатель на экспортированной функции с помощью функции dlsym() и освободить библиотеку из памяти с помощью функции dlclose(). Это эквиваленты LoadLibrary(), GetProcAddress() и FreeLibrary() на Windows.

Смотрите это обсуждение для примера:

Difficulties with calling an Android NDK function from directly Delphi

+0

ок, спасибо, что это хорошая новость. есть ли способ установить местоположение, в которое будет развернута библиотека (или получить путь во время выполнения), чтобы приложение могло его найти? в примере используется фиксированный путь, который является специфичным для устройства – laggyluk

+0

@laggyluk: [Стандартные местоположения путей RTL на поддерживаемых целевых платформах] (http://docwiki.embarcadero.com/RADStudio/XE5/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms) –