- Русские Блоги
- Как Android вызывает сторонние SO библиотеки
- Русские Блоги
- Как скомпилировать .so файл для системы Android — Android Studio
- Интеллектуальная рекомендация
- Многослойная презентацияViewController Jap
- Распечатать список с конца до головы
- Типы данных и переменные
- Python Daily Practice (4) -идиомы заполняют музыку
- Как включить *.so библиотеку в Android Studio?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
Русские Блоги
Как 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. Да
Источник
Русские Блоги
Как скомпилировать .so файл для системы Android — Android Studio
Полное название NDK — Native Development Kit. NDK предоставляет ряд инструментов, помогающих разработчикам быстро разрабатывать динамические библиотеки на C (или C ++), и может автоматически упаковывать таковые и Java-приложения вместе в apk. Интегрированный кросс-компилятор NDK (кросс-компилятор требует UNIX или LINUXсистемаEnvironment) и предоставляет соответствующие mk-файлы, чтобы изолировать различия в CPU, платформе, ABI и т. Д. Разработчикам нужно просто изменить mk-файл (указать «какие файлы должны быть скомпилированы», «требования к функциям компиляции» и т. Д.), Чтобы их создать.
Зачем использовать NDK?
1. Защита кода. Поскольку код Java-уровня apk легко декомпилируется, библиотеку C / C ++ трудно перевернуть.
2. Вы можете легко использовать существующие библиотеки с открытым исходным кодом. Большинство существующих библиотек с открытым исходным кодом написаны на языке C / C ++.
3. Повысить эффективность выполнения программы. Прикладная логика, требующая высокой производительности, будет разработана с использованием языка C для повышения эффективности выполнения прикладных программ.
4. Легко пересадить. Библиотека, написанная на C / C ++, может быть легко использована снова на других встроенных платформах.
Полное имя JNIJavaСобственный интерфейс, который предоставляет несколько API для взаимодействия между Java и другими языками (в основном C и C ++).
Зачем использовать JNI?
Цель JNI состоит в том, чтобы позволить java-методам вызывать некоторые функции, реализованные c.
Что такое файл так в Android?
Файл so, используемый в Android, представляет собой библиотеку функций C ++. В Android JNI соответствующий язык C должен быть упакован в библиотеку so, а затем импортирован в папку lib для вызова java.
AndroidСтудия NDK и так разработка файлов
Установка и настройка NDK
Android Studio поддерживает NDK начиная с версии 1.3 Beta1. Ранее он не поддерживался, поэтому мы рекомендуем использовать новую версию редактора.
Щелкните правой кнопкой мыши текущий проект => Открыть настройки Moudle => Расположение Android SDK
Если он не установлен, нажмите «Установить» для загрузки;
Затем настройте переменные среды;
Настройте переменные среды
Установленный NDk обычно находится в пакете ndk под вашей папкой sdk.
Например, вот я: D: \ SDK \ ndk-bundle (как показано ниже), вы можете видеть, что есть файл ndk-build, который мы будем использовать при компиляции ниже.
Затем настройте путь к пути вашей системной переменной следующим образом:
1. Создайте NDK_ROOT в системных переменных окружения
2. Добавьте NDK_ROOT к переменной среды Path ->;% NDK_ROOT%
После добавления откройте cmd, введите ndk-build, и следующее содержимое будет указывать на успех (говорит, что оно успешно выполнено в Интернете, хотя оно выглядит как какое-то сообщение об ошибке, но оно будет успешно скомпилировано, когда следующий текст выполняется без проблем).
поэтому развитие библиотеки
Новый «локальный» метод
Как показано ниже, метод установлен в MainActiviy.java
public native String getStrFromJNI();
Вы можете видеть, что в объявлении этого метода есть ключевое слово native. Это ключевое слово указывает на то, что этот метод является локальным методом, то есть этот метод getStrFromJNI () реализован локальным кодом (C / C ++), который является только объявлением в коде Java. ,
Скомпилируйте класс, чтобы получить соответствующий файл .h
Переключитесь на Терминал, введите каталог java проекта (как показано ниже) и введите
javah -jni -encoding имя пакета UTF-8. Имя класса (как показано ниже).
После успешной компиляции обновите проект, и вы увидите скомпилированный файл .h. Этот файл просто помогает нам написать соответствующий файл .c, который можно удалить после использования.
Код файла выглядит следующим образом:
/* DO NOT EDIT THIS FILE — it is machine generated */
/* Header for class cn_handsomedragon_testndk_MainActivity */
JNIEXPORT jstring JNICALL Java_cn_handsomedragon_testndk_MainActivity_getStrFromJNI
На самом деле, важной частью является этот код:
JNIEXPORT jstring JNICALL Java_cn_handsomedragon_testndk_MainActivity_getStrFromJNI
Тщательное наблюдение показывает, что он организован в соответствии с «именем локального метода имени класса имени Java_package» (после их понимания мы можем написать файл .c без создания файла .h в будущем).
Написать .c файл
В это время мы переключаемся на Project, а затем создаем новую папку jni в каталоге приложения и создаем файл demo.c c (как показано ниже).
Напишите самый основной тестовый код в файле demo.c:
Java_cn_handsomedragon_testndk_MainActivity_getStrFromJNI(JNIEnv *env,jobject thiz) <
return (*env)->NewStringUTF(env, «I`m Str !»);
Это видно из того, что мы используем строку кода в .h, слегка модифицированную по сравнению с указанным выше форматом. Нам нужен файл .c.
Написать файл Android.mk
Создайте новый файл Android.mk (должен называться Android.mk) в каталоге jni, как показано на следующем рисунке:
Отредактируйте код Android.mk:
LOCAL_PATH := $(call my-dir)
LOCAL_MODULE: = demo // Имя библиотеки so, которая будет сгенерирована, но на самом деле это libdemo.so
LOCAL_SRC_FILES: = demo.c // Используемый файл, только что записанный файл demo.c
Создать файл так
В консоли введите каталог приложения проекта, а затем введите ndk-build (как показано ниже), компиляция может быть выполнена без проблем.
Обновив проект после завершения компиляции, вы можете увидеть папки libs и obj, созданные в каталоге приложения, где libs полезны, а папка obj бесполезна и может быть удалена. Вы можете увидеть сгенерированный файл libdemo.so в libs.
Две необходимые настройки
1. Установите путь NDK в local.properties. Мой пример NDK выглядит следующим образом:
2. Установите под узлом Android в build.gradle приложения:
После того, как два необходимых места будут изменены, вы можете вызвать файл so, который мы сгенерировали счастливо.
Использовать так файл
В MainActivity.java загрузите файл so и вызовите его, код выглядит следующим образом:
Эта демонстрация библиотеки (полное имя — libdemo.so) будет загружена при первом использовании класса MainActivity. (Код, объявленный в блоке статического кода, будет выполнен перед методом onCreate)
Наблюдая за выводом консоли, вы можете увидеть напечатанную строку:
В настоящее время это означает, что библиотека so используется успешно, и предыдущая папка jni и изначально созданный файл .h могут быть полностью удалены. Конечно, вам необходимо вести хорошую запись об этой библиотеке, иначе предполагается, что вы также забудете, какие локальные методы могут быть вызваны.
Интеллектуальная рекомендация
Многослойная презентацияViewController Jap
. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.
Распечатать список с конца до головы
В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.
Типы данных и переменные
тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.
Python Daily Practice (4) -идиомы заполняют музыку
оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.
Источник
Как включить *.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
Источник