Установка Chilkat на Android

Я пытаюсь использовать библиотеку chilkat в существующем приложении, которое использует API 16 под Android Studio (macOS - Android Studio 3.5). Требуются предложения о том, как правильно импортировать библиотеку chilkat в Android Studio.

Мне нужно определить, можно ли использовать библиотеку с приложением (о некоторых операциях SFTP).

Следуя инструкциям на сайте Chilkat (https://www.chilkatsoft.com/chilkatAndroid.asp) Мне удалось скомпилировать приложение, включая библиотеку. Однако, чтобы скомпилировать приложение, мне пришлось добавить поддержку Multidex в сборку gradle для приложения:

........ ........ android {compileSdkVersion 28 buildToolsVersion '27 .0.3 'defaultConfig {minSdkVersion 16 targetSdkVersion 16 versionCode 72 versionName' 1.6.6 'multiDexEnabled true ‹------- добавлено} dexOptions {javaMaxHeapSize "4g"} ......... ......... зависимости {....... ....... реализация 'com.android.support : multidex: 1.0.3 '‹---- добавлено}

И «структура проекта» приложения отличается от описанной в инструкциях, поэтому я скопировал файлы libs в каталог jniLibs в каталоге / app проекта. Исходные файлы были скопированы в: / app / src / main / java / com / chilatsoft

В основное приложение я включил библиотеку, как было предложено в инструкции, и добавил загрузчик.

В конце концов, я могу скомпилировать приложение без ошибок, однако во время выполнения происходит сбой приложения, указывающий, что библиотека chilkat не найдена.

java.lang.UnsatisfiedLinkError: не удалось загрузить chilkat из загрузчика dalvik.system.PathClassLoader [DexPathList [[zip-файл «/system/framework/com.symbol.emdk.jar», zip-файл »/data/app/com.xxxxxxxxxxx .apk "], nativeLibraryDirectories = [/ data / app-lib / com.xxxxxxxxxxx, / vendor / lib, / system / lib]]]: findLibrary вернул значение null в java.lang.Runtime.loadLibrary (Runtime.java:358)

Это заставляет меня думать, что я неправильно импортировал библиотеку. Любые подсказки / инструкции по правильному импорту чилката?

Прежде чем покупать лицензию, я хотел бы быть уверен, что библиотеку можно будет использовать для проекта. Я не могу изменить API или перезапустить с нуля или изменить структуру текущего приложения.

Спасибо за любую помощь! Стив


person thefwguy    schedule 23.08.2019    source источник


Ответы (2)


Когда ваше приложение загружает JNI. Поэтому поделитесь библиотекой следующим образом:

static 
    {
    System.loadLibrary("chilkat");
    }

Загрузчик среды выполнения Java ищет в каком-то списке каталогов libchilkat.so.

Сообщение об ошибке, кажется, показывает список каталогов, в которых он ищет:

alvik.system.PathClassLoader[DexPathList[[zip file "/system/framework
/com.symbol.emdk.jar", zip file "/data/app/com.xxxxxxxxxxx.apk"],
nativeLibraryDirectories=[/data/app-lib/com.xxxxxxxxxxx, 
/vendor/lib, /system/lib]]]: findLibrary returned null at
 java.lang.Runtime.loadLibrary(Runtime.java:358)

Каталоги:

/data/app-lib/com.xxxxxxxxxxx

/ vendor / lib

/ система / библиотека

И libchilkat.so нет ни в одном из них. Libchilkat.so находится в каталоге в дереве каталогов вашего проекта. Одно из решений - переместить libchilkat.so в один из этих каталогов. Другое решение - (каким-то образом) добавить каталог, в котором существует libchilkat.so, в список каталогов, в которых выполняется поиск.

Другое возможное решение - явно загрузить файл .so. Вместо вызова System.loadLibrary ("chilkat"), где вы оставляете это на усмотрение системы для поиска libchilkat.so, вызовите System.load вместо System.loadLibrary. (См. https://www.chilkatsoft.com/java-loadLibrary-Linux.asp) Но это может быть сложно, потому что загружаемый .so зависит от архитектуры времени выполнения (armeabi-v7a, x86_64 и т. д.)

person Chilkat Software    schedule 26.08.2019
comment
Упомянутые каталоги находятся в устройстве, поэтому мне нужно найти способ, чтобы система перенесла их в apk. В проекте они расположены в каталоге project_root / app / jniLibs, а каталог jniLibs имеет 4 архитектуры (arm64-b8a / armeabi-v7a, x86 и x86_64. Я предполагаю, что это неправильное расположение, то есть система не помещает .so на правильное место в устройстве. В исходной инструкции указаны другие места, но проект настроен по-другому. Спасибо за ответ, я пытаюсь посмотреть, смогу ли я их включить. - person thefwguy; 26.08.2019
comment
Может быть, использование multidex испортило расположение библиотеки? До использования chilkat проект не использовал multidex. При добавлении библиотеки код не компилировался, если не было включено multidex. - person thefwguy; 26.08.2019
comment
Хм, ладно, кажется, я кое-что нашел. Я переместил каталог jniLibs (который содержит 4 архитектуры для chilkat lib) на тот же уровень каталога res / assets / java (в моем случае project_root / app / src / main / jniLibs). Теперь библиотека загружена правильно (т.е. присутствует в файле apk). Но теперь сбой кода по другим причинам :( Вздох ... кажется, chilkat мешает регистратору (slf4j). Я открою еще одну ветку в конце концов. Спасибо за ответ! - person thefwguy; 26.08.2019

Для начала необходимо установить и настроить Android ndk.

для разработчиков Android ndk документация

Затем вам нужно включить соответствующие файлы .so

загрузить файлы .so в android

Наконец, вам нужно загрузить собственный код с помощью

static 
    {
    System.loadLibrary("chilkat");
    }

Как только это будет сделано, вы можете продолжить обучение.

Примеры официальных учебных пособий по chilkat

person Shay Ribera    schedule 22.03.2021