Einzelnen Beitrag anzeigen

philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
893 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Wo müssen externe shared objects unter Android hin?

  Alt 15. Aug 2020, 12:09
Bei Android muss man die so.Dateien normalerweise zweimal bereitstellen (32-bit und 64-bit):
- library\lib\arm64-v8a\
- library\lib\armeabi-v7a\

Es hängt aber am Ende vom Device (Android-Version) und auch von der Library ab, wo genau gesucht wird. Ich habe daher begleiten bei mir folgenden Code eingebaut, damit alle PreLaunch-Tests erfolgreich sind (sowohl bei Google als auch bei Amazon):

Für OpenSSL:
Delphi-Quellcode:
  IdSSLOpenSSLHeaders.Load();
  {$IFDEF ANDROID}     
     help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
     if (length(help2)>0) then
     begin
       IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetLibraryPath));
       IdSSLOpenSSLHeaders.Load();
       help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
       if (length(help2)>0) then
       begin
         IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetDocumentsPath));
         IdSSLOpenSSLHeaders.Load();
         mlog.info('SSL-Version(3): '+OpenSSLVersion);
         help2:=IdSSLOpenSSLHeaders.WhichFailedToLoad();
         if (length(help2)>0) then
         begin
           mlog.info('SSL-Errors: '+help2);
         end;
       end else begin
         mlog.info('SSL-Version(2): '+OpenSSLVersion);
       end;
     end else begin
       mlog.info('SSL-Version(1): '+OpenSSLVersion);
     end;
AV-Player (hier habe ich den Original-Code gepatch, wird aber wahrscheinlich auch in den Original-Code nach Test durch den Hersteller übergehen:
Delphi-Quellcode:
function MySafeLoadLibrary(ModuleName:string):HMODULE;
var
  Error: string;
  {$IF Defined(ANDROID)}
  function ShouldNativeLibrariesBeExtracted: Boolean;
  begin
    if TOSVersion.Check(6, 0) then
      Result := (TAndroidHelper.Context.getApplicationInfo.flags and TJApplicationInfo.JavaClass.FLAG_EXTRACT_NATIVE_LIBS) <> 0
    else
      Result := True;
  end;
  {$ENDIF}
begin
  {$IF Defined(ANDROID)}
  if ShouldNativeLibrariesBeExtracted then
    ModuleName := TPath.Combine(TPath.GetLibraryPath, ModuleName);
  {$ENDIF}
  Result := LoadLibrary(PChar(ModuleName));
  if Result = 0 then
  begin
    Error := string.Format('Could not load ''%s'' due to: %s', [ModuleName, string(UTF8String(dlerror))]);
    log.d('mySafeLoadLibrary: '+error);
    ShowMessage(Error);
    raise Exception.Create(Error);
  end;
end;
  Mit Zitat antworten Zitat