我很难完成如何在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;
答案 0 :(得分:1)
您可以使用函数声明上的Delphi标准external
语法静态链接到.so文件的导出函数,并将.so文件指定为外部库。
或者您可以使用dlopen()
函数自动将.so动态加载到内存中,使用dlsym()
函数检索导出函数的指针,并使用{{1}从内存中释放库功能。这些是Windows上dlclose()
,LoadLibrary()
和GetProcAddress()
的等效项。
请参阅此讨论以获取示例:
Difficulties with calling an Android NDK function from directly Delphi