Перейти к содержанию
  • 0
krapotkin

Ошибка java.lang.IllegalArgumentException: Unable to load native library... libProject1.so

Вопросы

В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось.

Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1

Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает.

LogCat дает крайне странную картину

java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so

Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3.

Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же.

Короче, очень много комбинаций версий SDK/NDK проверено.

Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22.

image.png.2316ca48a544f09750f216cb06cbb069.png

При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает

image.png.f6ade1e9696c0606c1aa1b5022f6541d.png

Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus

 

Спасибо за участие и помощь в разборе завалов @Andrey Efimov

 

Отредактировал krapotkin

Поделиться сообщением


Ссылка на сообщение

Рекомендуемые сообщения

  • 0

У меня эта же ошибка выскакивает у пользователей и на моем тестовом телефоне с андроид 6, и на некоторых 5х. Самое интересное, что при установке по поводу из Дельфи, этой же сборки- все нормально. Нашел несколько тем на форуме Дельфи ( андр 5 - крах и т.д.) везде спасает даунгрейд ndk ( для 5.1 до 21) сейчас тоже буду подбирать. 

Поделиться сообщением


Ссылка на сообщение
  • 0

У меня похожая проблема. Xiaomi Redmi 5А Android 8.1. Дельфи 10.3.3. Как исправить не знаю.:(

java.lang.UnsatisfiedLinkError: Unable to load native library "/data/app/com.embarcadero.PublicRadio-4y7RRJgE_6Kqam1AqOIbFQ==/lib/arm64/libPublicRadio.so": null
    at android.app.NativeActivity.onCreate(NativeActivity.java:174)
    at com.embarcadero.firemonkey.FMXNativeActivity.onCreate(FMXNativeActivity.java:106)
    at android.app.Activity.performCreate(Activity.java:7088)
    at android.app.Activity.performCreate(Activity.java:7079)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1616)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:176)
    at android.app.ActivityThread.main(ActivityThread.java:6651)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

 

ndk.jpg

Поделиться сообщением


Ссылка на сообщение
  • 0

на 10.3.3 и Redmi 5А все абсолютно штатно шло, проверял

На скриншоте вкладка SDK Android 64-bit, 5А - старый, 32-битный

Поделиться сообщением


Ссылка на сообщение
  • 0
5 минут назад, krapotkin сказал:

на 10.3.3 и Redmi 5А все абсолютно штатно шло, проверял

На скриншоте вкладка SDK Android 64-bit, 5А - старый, 32-битный

А галочка в настройках вроде должна ему помочь Generate Android App Bundle file (arm + arm64) = true?

Еще заметила у вас ошибка IllegalArgumentException, а у меня UnsatisfiedLinkError. Не понятно...

Поделиться сообщением


Ссылка на сообщение
  • 0

Чистое приложение запускается у меня и без галочки Generate Android App Bundle file. Все нормально. А вот рабочий проект с BASS не хочет... :(

Поделиться сообщением


Ссылка на сообщение
  • 0

А как правильно добавить SO файлы?

The BASS libraries (libbass.so) aren't included in that APK file - they should be alongside the libPublicRadio.so files under the lib folder. I'm not a Delphi user myself, so I'm afraid I'm unfamiliar with how you should do this but you basically need to tell it to include the BASS libraries in your app.

Добавила как на картинке. Что упущено?

 

bass.jpg

Поделиться сообщением


Ссылка на сообщение
  • 0

Обратите внимание на конечные пути (Remote Path). Цитата, которую вы привели, как раз говорит вам "they should be alongside the libPublicRadio.so files under the lib folder.", т.е. для файлов библиотеки должны быть указаны те же пути, что и для libPublicRadio.so.

Поделиться сообщением


Ссылка на сообщение
  • 0

Спасибо! Заработало. В смысле запустилось на устройстве без проблем.

Правда музыка BASS не играет как в Windows. Буду копать. :)

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От uakmal
      Здравствуйте!
      Создаю медиаплеер для Android TV. 
      Запускаю плеер, нажимаю на условную кнопку, которая делает следующее: 
      MediaPlayer1.FileName:='/storage/emulated/0/download/1.mp4'; После нажатия вылетает окошко с надписью:
      java.lang.java.lang.illegalargumentexception после закрытия окошки нажимаю на play, но ничего не происходит.
      Подскажите, пожалуйста как исправить это?
    • От Delpher-X
      Итак, я пробовал использовать компоненты AppTethering для передачи данных между VCL-приложением работающим под Windows и мобильным FMX-приложением и потерпел неудачу, так как выяснилось что потоки данных данные компоненты на деле не передают. И у меня возник вопрос: а нет ли каких других компонентов в современной Embarcadero Studio, которые бы позволяли передавать как строковые данные, так и файлы между приложениями? Особенно меня интересуют все же файлы. 
    • От Delpher-X
      Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: 
      var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: 
      procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.  
    • От Delpher-X
      Есть код для копирования файлов:
      procedure TForm1.Timer2Timer(Sender: TObject); var FileIndex, FileName : String; I : Integer; begin randomize; FileIndex := IntToStr(random(5000)); for I := 0 to ListBox1.Items.Count-1 do begin FileIndex := IntToStr(StrToInt(FileIndex) + 1); FileName := FileIndex + Exp; TFile.Copy(ListBox1.Items[I], FileName); end; Timer2.Enabled := False; end; Когда я его запускаю, все работает, однако постоянно выскакивает сообщение об ошибке: specified file already exists, то есть копируемый файл уже существует. То есть, программа пытается каждый файл скопировать дважды. Вопрос: почему? С чем это связано и как от этого избавиться? 
    • От Delpher-X
      Здравствуйте. У меня такая проблема. 
      Пытаюсь скачать файл:
       
      var S : TMemoryStream; begin S := TMemoryStream.Create(); IdHTTP1.Get('http://sitename.com/7UlmBU7IXHA.jpg', S); S.SaveToFile('/storage/emulated/0/ImageFile.jpg'); S.Free; end;
      Проблема возникает на последней стадии - при сохранении файла. Android пишет, Cannot create file: '/storage/emulated/0/ImageFile.jpg'. Permission denied, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
    • От Delpher-X
      Здравствуйте. Как указываются пути к каталогам и файлам в Android? Скажем, в Windows я указываю такой путь:  C:/Windows/Folder, а как это делается в Android? Особенно меня интересует, как обратиться к корневому каталогу, для создания там новой папки или файла, в Windows это C:/, или D:/ а тут как? 
    • От destroyer86
      Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами.
      Теперь сам вопрос в JavaInterfaces.pas есть описание:
       
      JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end; Что бы получить доступ к методам интерфейса используется следующая конструкция:
      JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass
      Вот пример кода на Java, который хочу реализовать в Delphi:
      UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) { return; } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...