如何在android上使用第三方库?

时间:2014-02-05 16:29:45

标签: android delphi firemonkey delphi-xe5 loadlibrary

我很难完成如何在firemonkey应用程序中加载和使用已编译的.so库。我设法以一种方式设置项目,它编译和库捆绑在apk但在应用程序启动时无法加载它。是system.LoadLibrary()还是我需要一些lib的java包装器?

编辑:我的代码现在看起来像这样,仍然无法通过库加载阶段。 TPath.GetLibraryPath返回库所在的正确路径(我使用adb pull检查)

{$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;

1 个答案:

答案 0 :(得分:1)

您可以使用函数声明上的Delphi标准external语法静态链接到.so文件的导出函数,并将.so文件指定为外部库。

或者您可以使用dlopen()函数自动将.so动态加载到内存中,使用dlsym()函数检索导出函数的指针,并使用{{1}从内存中释放库功能。这些是Windows上dlclose()LoadLibrary()GetProcAddress()的等效项。

请参阅此讨论以获取示例:

Difficulties with calling an Android NDK function from directly Delphi