【问题标题】:how to use 3rd party library on android?如何在 android 上使用 3rd 方库?
【发布时间】:2014-02-05 16:29:44
【问题描述】:

我很难找到如何在 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;

【问题讨论】:

  • 也许你可以展示一下你目前拥有的东西的精简版

标签: android delphi firemonkey delphi-xe5 loadlibrary


【解决方案1】:

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

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

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

Difficulties with calling an Android NDK function from directly Delphi

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多