Android lib so path

Русские Блоги

Как Android вызывает сторонние SO библиотеки

Описание проблемы: Как Android вызывает сторонние SO библиотеки;
известные условия: Библиотека SO — это библиотека подключений версии Android (файл * .so), которая предоставляет подробные инструкции по интерфейсу;
Знай решение:
1. Поместите файл SO непосредственно в libs / armeabi, затем System.loadLibrary («xxx») в коде, затем в public native static int xxx_xxx_xxx (), затем вы можете напрямую вызвать метод xxx_xxx_xxx ();
2. Второе решение состоит в том, чтобы создать свой собственный файл SO, вызвать сторонний SO в своем собственном файле SO, а затем вызвать свой собственный SO в программе. Это более сложно. Требуется создать файл класса Java, сгенерировать файл .h и написать Исходный файл C включает в себя файл .h, сгенерированный перед включением соответствующего метода, и, наконец, использует скрипт ndk-build в комплекте разработки android NDK для создания соответствующей общей библиотеки .so;
Решить:
1. Возможны ли вышеуказанные два варианта? В чем проблема, если это невозможно?
2. В чем разница между двумя схемами? Почему вторые решения используются в основном в Интернете?
3. Существует только один файл * .so, и предоставляется подробное описание интерфейса. Можно ли его использовать в ANDROID?

Прежде всего, это зависит от того, является ли этот SO SO спецификации JNI, например, возвращает ли он тип, который JNI не поддерживает напрямую. Другими словами, может ли это так называться непосредственно как JNI. Если ответ «нет», вы можете выбрать только второй вариант.

Если ответ «да», это зависит от того, хотите ли вы, чтобы эта библиотека SO была напрямую представлена ​​слою JAVA. Если ответ «нет», вы можете выбрать только второе решение, например, вы также являетесь поставщиком библиотеки.

Как правило, если у вас есть только SO, это означает, что это предоставляется вам другими, и вы можете попросить другую сторону предоставить вам поддержку файлов вызовов JAVA.

1. Это зависит от того, соответствует ли SO спецификации вызова JNI. Это зависит от ваших собственных пожеланий.
2. Поскольку второй метод является наиболее гибким, могут быть реализованы различные ситуации.
3. Да

Источник

libs file(*.so) inside split apk doesn’t extracted to folder «lib» in App Bundle #39

Comments

rafirafika commented Dec 28, 2018 •

Hello team,
I have problem when try to read libs file (.so) within app bundle.
commonly, if we install installer file (
.apk), this .apk file will be extracted in the device on folder data/app/packageName and inside it there are «lib» folder that contain libs file.
But when I installed app bundle and when bundle is extracted on the device my folder «data/app/mypackageName/lib» is empty. all my libs files (*.so) that I need still in splitApk.apk file

preview for extracted bundle file in device

preview for extracted .apk file in device

command that I used to install aps bundle is :
install-apks —apks=!BASENAME_PATH!.apks —modules=dlc_module

Question :
Could I get all libs(*.so) files such as if we use .apk file as installer? because I need this file to handle security system in my apps
If I couldn’t , Could you please give me some advice?

Btw, sorry if my question is not clear enough, my english is very bad.

The text was updated successfully, but these errors were encountered:

plecesne commented Dec 28, 2018

From Android M, the Android platform supports uncompressed native libraries in APKs, which allows the platform to read the native libraries directly from the APK without having to extract them. This is why you don’t see them in the «lib/» directory if you’re testing on a device on Android M or later.

Читайте также:  Genshin impact зависает андроид

Since the Android platform reads the native libraries from the APK directly, you should probably do the same if you need to verify something on them.

There is a flag in Gradle to disable this feature but that leads to bigger APKs on users devices since the native libraries are extracted out of the APK (and thus also longer installation times), so unless there is no workaround for what you’re trying to achieve, I would strongly discourage disabling it.

rafirafika commented Dec 31, 2018 •

Hy @plecesne thanks for your info and suggestion.
seems I’ll choose to read native libs from Apk directly. J

trungnd90 commented Sep 16, 2019

@plecesne «There is a flag in Gradle to disable this feature» Could you give detail about this? I want to try disable it.

plecesne commented Sep 16, 2019 •

You can set the property android.bundle.enableUncompressedNativeLibs=false in the gradle.properties . Would you mind sharing why this is causing you issue?

trungnd90 commented Sep 16, 2019

I just want to have more free space to push some data into apk

plecesne commented Sep 16, 2019 •

By compressing the native libraries, the APKs served to your users will be bigger! I explained this a bit better in #118

Although the App Bundle looks bigger and the APK files look bigger, the compression performed over the wire will be more efficient, leading to smaller downloads, and the size on device will be saved as well since the platform will not have to extract it at install time (which would result in two copies of the native libraries on device: one compressed in the APK, and one uncompressed in the installation directory).

Note also regarding size limits that the Play Console doesn’t not validate the size based on the size of the App Bundle but based on the download size of the generated APKs, so compressing the native libraries doesn’t gain you anything there either.

rpattabi commented Dec 13, 2019

You can set the property android.bundle.enableUncompressedNativeLibraries=false in the gradle.properties . Would you mind sharing why this is causing you issue?

@plecesne Thanks, but the correct property is android.bundle.enableUncompressedNativeLibs

We would like you to be aware that we couldn’t use uncompressed native libs feature as we need to use the path of the .so files. For example, when we use pure data, a audio manipulating engine, we shall providing the native library path to its API for it to discover the custom externals that we built for it to consider in audio processing. So native library path is critical for our purposes. If we leave native libs uncompressed in apk, the path returned by ApplicationInfo.nativeLibraryDir does not contain native libraries anymore. So puredata engine wouldn’t discover our custom externals.

Hope that makes sense. I wonder if there is a way to get valid native libraries path even if we keep native libs uncompressed in the apk.

Источник

How to Include *.so Library in Android Studio?

The SO file stands for Shared Library. You compile all C++ code into the.SO file when you write it in C or C++. The SO file is a shared object library that may be dynamically loaded during Android runtime. Library files are larger, often ranging from 2MB to 10MB in size. As a result, the app becomes bloated. Another thing to keep in mind is that several.SO files need to be included in the APK to support several architectures such as armeabi and x86. .so files are the ABI Files, ABI stands for Application Binary Interface. The ABI specifies how your app’s machine code should communicate with the OS during execution. The NDK is a software development kit. As a result, files are compared to these definitions.

Читайте также:  Андроид the white door

Including the .so files in the Android Studio Project

So what if you want to include some .so files in your Android App or Android Project, well there are several ways to do that, but we will be finding out the perfect ones that can help you get the library included in no time! Keep on reading this article!

Method #1: Creating the JniLibs folder

Create a folder called “jniLibs” in your app, along with the directories that contain your *.so. The “jniLibs” folder should be established alongside your “Java” and “Assets” directories.

Method #2: Modification of the build.gradle file

It is feasible to avoid creating a new folder and maintain your *.so files in the libs folder! In that case, just place your *.so files in the libs folder (following the same architecture as Solution 1: libs/armeabi/.so, for example) and update your app’s build.gradle file to include the jniLibs source directory.

Method #3: Putting files within ABI Folder

Put your .so files in the libs folder as shown in the folder to add them

Figure 1. Understanding the Structure of the .jar & so file

Then add this code to your project

Method #4: Cleaning and Adding to “armeabi”

Method #5: Using the ABI Filters

If you’re using Android Studio 4.1.2, and have tried to specify the NDK

Источник

Как включить *.so библиотеку в Android Studio?

Я прочитал много потоков, как добавить библиотеку *.so в Android Studio, но никто из них не работает, особенно когда дело доходит до точки текста: это не работает с новым xxx (Android Studio, gradle. )

Мы можем начать с нуля. Я получил:

Android Studio 0.6.0

Из структуры проекта я вижу:

Скомпилируйте Sdk Version 19 Build Tools Версия 19.1.0

Я получил файлы *.so, предварительно скомпилированные, и в демонстрационном приложении они работают. Я должен изменить исходный код приложения, поэтому мне нужно перестроить с теми же файлами *.so.

ОТВЕТЫ

Ответ 1

Создайте новую папку project/app/src/main/jniLibs , а затем поместите ваши файлы *.so со своими папками abi в это местоположение.

Устаревшее решение

Добавьте оба фрагмента кода в свой файл gradle.build в качестве зависимости:

Как создать эту настраиваемую банку:

Тот же ответ можно найти и в связанном с ним вопросе: Включить .so библиотеку в apk в андроид-студии

Ответ 2

Добавление .so Library в Android Studio 1.0.2

  • Создать папку «jniLibs» внутри «src/main/»
  • Поместите все ваши библиотеки .so внутри папки «src/main/jniLibs»
  • Структура папки выглядит,
    | —app:
    | — | —src:
    | — | — | —main
    | — | — | — | —jniLibs
    | — | — | — | — | —armeabi
    | — | — | — | — | — | — | -.
    | — | — | — | — | —x86
    | — | — | — | — | — | — | -.
  • Никакой дополнительный код не требует просто синхронизации вашего проекта и запуска вашего приложения.

Ответ 3

*. поэтому библиотека в Android Studio

Вам нужно создать папку jniLibs внутри main в проектах android Studio и поместить все ваши файлы .so внутри. Вы также можете интегрировать эту строку в build.gradle

compile fileTree (dir: ‘libs’, include: [‘.jar’, ‘. so’])

Он отлично работает

Это структура проекта.

Ответ 4

Решение 1. Создание папки JniLibs

Создайте в своем приложении папку «jniLibs» и папки, содержащие ваш *.so внутри. Папка «jniLibs» должна быть создана в той же папке, что и папки «Java» или «Assets».

Решение 2. Модификация файла build.gradle

Если вы не хотите создавать новую папку и сохраняете свои файлы *.so в папке libs, это возможно!

В этом случае просто добавьте файлы *.so в папку libs (пожалуйста, соблюдайте ту же архитектуру, что и решение 1: libs/armeabi/.so) и измените файл build.gradle вашего приложения, чтобы добавить исходный каталог jniLibs.

У вас будет больше объяснений со скриншотами, которые помогут вам здесь (шаг 6):

Ответ 5

Это мой файл build.gradle, обратите внимание на строку

Это будет включать файл libs *.so в apk.

Ответ 6

Чтобы использовать собственную библиотеку (так что файлы) Вам нужно добавить некоторые коды в файл «build.gradle».

Этот код предназначен для очистки каталога «armeabi» и копирования файлов «so» в «armeabi», в то время как «чистый проект».

Ответ 7

Я решил подобную проблему, используя внешние родственные зависимости lib, которые упакованы внутри файлов jar. Иногда эти библиотеки зависимостей архитектуры упаковываются все в одну банку, иногда они разбиваются на несколько файлов jar. поэтому я написал некоторый buildscript для сканирования зависимостей jar для родных libs и сортировки их в правильные папки Android для Android. Кроме того, это также обеспечивает способ загрузки зависимостей, которые не найдены в maven-репозиториях, которые в настоящее время полезны для работы JNA на андроиде, потому что не все родные банки публикуются в публичных репозиториях maven.

Ответ 8

Официальный анонс Android NDK hello-libs Пример CMake

Просто работал у меня на хосте Ubuntu 17.10, Android Studio 3, Android SDK 26, поэтому я настоятельно рекомендую вам основывать свой проект на нем.

Общая библиотека называется libgperf , key code части:

Затем, если вы посмотрите на /data/app на устройстве, там будет libgperf.so .

на С++-коде, используйте: #include

расположение заголовка: hello-libs/distribution/gperf/include/gperf.h

Если вы поддерживаете только некоторые архитектуры, см. Gradle Создание только NDK-цели только ARM

Источник

Как включить * .so библиотеку в Android Studio?

Я прочитал много тем, как добавить библиотеку * .so в Android Studio, но ни одна из них не работает, особенно когда дело доходит до текста: это не работает с новым xxx (Android Studio, gradle, …)

Можем ли мы начать с нуля. Я получил:

Android Studio 0.6.0

Из структуры проекта я вижу:

Модули / приложение: Свойства:

Компиляция Sdk Version 19 Build Tools Версия 19.1.0

Я получил файлы * .so, предварительно скомпилированные, и в демонстрационном приложении они работают. Я должен изменить исходный код приложения, поэтому мне нужно перестроить с теми же * .so файлами.

Создайте новый project/app/src/main/jniLibs папки project/app/src/main/jniLibs а затем поместите ваши файлы *.so со своими папками abi в это место.

Устаревшее решение

Добавьте оба фрагмента кода в ваш файл gradly.build как зависимость:

Как создать эту обычную банку:

Тот же ответ можно найти и в соответствующем вопросе: включить .so библиотеку в apk в андроид-студию

Добавление .so Library в Android Studio 1.0.2

  1. Создать папку «jniLibs» внутри «src / main /»
  2. Поместите все ваши библиотеки .so внутри папки «src / main / jniLibs»
  3. Структура папки выглядит,
    | –app:
    | – | –src:
    | – | – | –main
    | – | – | – | –jniLibs
    | – | – | – | – | –armeabi
    | – | – | – | – | – | – | -.
    | – | – | – | – | –x86
    | – | – | – | – | – | – | -.
  4. Никакой дополнительный код не требует просто синхронизации вашего проекта и запуска вашего приложения.

* .so библиотека в Android Studio

Вы должны создать папку jniLibs внутри main в проектах android Studio и поместить все ваши файлы .so внутри. Вы можете также интегрировать эту строку в build.gradle

Compile fileTree (dir: ‘libs’, include: [‘ .jar’, ‘ .so’])

Это отлично работает

Это структура проекта.

Решение 1. Создание папки JniLibs

Создайте в своем приложении папку «jniLibs» и папки, содержащие ваш * .so внутри. Папка «jniLibs» должна быть создана в той же папке, что и папки «Java» или «Assets».

Решение 2. Модификация файла build.gradle

Если вы не хотите создавать новую папку и хранить файлы * .so в папке libs, это возможно!

В этом случае просто добавьте файлы * .so в папку libs (пожалуйста, соблюдайте ту же архитектуру, что и решение 1: libs / armeabi / .so) и измените файл build.gradle вашего приложения, чтобы добавить исходный каталог JniLibs.

У вас будет больше объяснений со скриншотами, которые помогут вам здесь (шаг 6):

Это мой файл build.gradle, обратите внимание на строку

Это будет включать файл * .so libs в apk.

Чтобы использовать собственную библиотеку (так что файлы), вам нужно добавить некоторые коды в файл «build.gradle».

Этот код предназначен для очистки каталога «armeabi» и копирования файлов «so» в «armeabi», в то время как «чистый проект».

Я решил аналогичную проблему, используя внешние родные зависимости lib, которые упакованы внутри файлов jar. Иногда эти библиотеки зависимостей архитектуры упаковываются все в одну банку, иногда они разбиваются на несколько файлов jar. Поэтому я написал некоторый buildscript для сканирования зависимостей jar для родных библиотек и сортировки их в правильные папки Android для Android. Кроме того, это также обеспечивает способ загрузки зависимостей, которые не найдены в maven-репозиториях, что в настоящее время полезно для работы JNA на android, потому что не все собственные банки публикуются в публичных репозиториях maven.

Источник

Читайте также:  Видеоредактор для андроид без водяного знака с переходами
Оцените статью