Как добавить .so, .mk и другие собственные файлы в Android Studio?

Я должен добавить собственные файлы .so, .mk, .sh, .cpp в свой проект в Android Studio. В eclipse .so файлы добавляются в папку libs и другие файлы в jni и obj папке, и все работает нормально. Но в студии Android Как я добавил файлы .so в папку jniLibs и внес изменения в файл .gradle, как показано ниже

ndk{ abiFilters 'armeabi', 'armeabi-v7a', 'x86' } sourceSets.main { jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk } 

Ниже приведена структура моего проекта и файлы, которые мне нужно добавить. Есть jni и obj папка, которые содержат собственный код, и я должен использовать это. Родные файлы в папках jni, obj и jniLibs

Я видел доступные ссылки, но они устарели, и ничего не получилось. Любая помощь приветствуется.

Войдите в систему после выполнения следующих изменений:

 sourceSets.main { jniLibs.srcDir 'src/main/libs' //set libs as .so's location instead of jniLibs jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk } externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } } 

Журнал:

 Error while executing 'E:\Android_SDK\ndk-bundle\ndk-build.cmd' with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=E:\folder\sampleapp\app\src\main\jni\Android.mk NDK_APPLICATION_MK=E:\folder\sampleapp\app\src\main\jni\Application.mk APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a NDK_DEBUG=1 APP_PLATFORM=android-16 NDK_OUT=E:/folder/app/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n} md "E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib\armeabi-v7a" >NUL 2>NUL || rem copy /b/y "E:\Android_SDK\ndk-bundle\build\\..\prebuilt\android-arm\gdbserver\gdbserver" "E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib\armeabi-v7a\gdbserver" > NUL E:/Android_SDK/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe [armeabi-v7a] "Gdbserver ": "[arm-linux-androideabi] E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdbserver" E:/Android_SDK/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe [armeabi-v7a] "Gdbsetup ": "E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdb.setup" E:/Android_SDK/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe "directory E:/Android_SDK/ndk-bundle/build//../platforms/android-16/arch-arm/usr/include E:/folder/app/src/main/jni E:/Android_SDK/ndk-bundle/build//../sources/cxx-stl/system" >> E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdb.setup E:/Android_SDK/ndk-bundle/build//../prebuilt/windows-x86_64/bin/echo.exe "set solib-search-path E:/folder/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a" > E:\folder\sampleapp\app\build\intermediates\ndkBuild\debug\lib/armeabi-v7a/gdb.setup process_begin: CreateProcess(NULL, "", ...) failed. make: *** No rule to make target `E:/folder/app/src/main/jni/SerialPort.c', needed by `E:/folder/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/serial_port/SerialPort.o'. Stop. Build command failed. Error:executing external native build for ndkBuild E:\folder\sampleapp\app\src\main\jni\Android.mk Build command failed. Error while executing 'E:\Android_SDK\ndk-bundle\ndk-build.cmd' with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=E:\folder\sampleapp\app\src\main\jni\Android.mk NDK_APPLICATION_MK=E:\folder\sampleapp\app\src\main\jni\Application.mk APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a NDK_DEBUG=0 APP_PLATFORM=android-16 NDK_OUT=E:/folder/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT=E:\folder\sampleapp\app\build\intermediates\ndkBuild\release\lib APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n} make: *** No rule to make target `E:/folder/app/src/main/jni/SerialPort.c', needed by `E:/folder/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/serial_port/SerialPort.o'. Stop. process_begin: CreateProcess(NULL, "", ...) failed. Error:executing external native build for ndkBuild E:\folder\sampleapp\app\src\main\jni\Android.mk 

Прежде всего, убедитесь, что ваше исходное местоположение, пример номеров. У вас есть некоторые проблемы. Все исходные файлы должны быть в файле src/main/

 ../src/main .........../jni # your cpp, header and mk files .........../jniLibs # your folders with all libs .........../java # other code 

Затем убедитесь, что вы загружаете свои libs в статическом поле перед тем, как использовать его в качестве основного, в Activity, Application и т. Д.

 private static final String LIB_NAME = "libserial_port"; private static final String LIB_NAME_1 = "libzqcom"; static { System.loadLibrary(LIB_NAME); System.loadLibrary(LIB_NAME_1); } 

UPD 1:

Убедитесь, что вы уже установили Android NDK Source for Native Android project.

Настройки Android SDK

Добавив ответ GensaGames, если у вас есть файл .mk, который вы используете для создания собственных библиотек, чтобы добавить его в процесс сборки, вы должны указать путь к этому файлу в файле build.gradle на уровне модуля, В блоке android {}:

 externalNativeBuild { ndkBuild { path 'path/to/Android.mk' } } 

В качестве примечания, структура каталогов, предложенная GensaGames, не является абсолютно необходимой для Android Studio – вы можете поместить свои файлы .mk и .cpp куда угодно, если вы укажете их каталог в build.gradle или Android.mk.

Для разработки на родном языке у вас должна быть папка main / jni, в которую вы должны поместить свои библиотеки и родные источники внутри нее и создать их в этой папке. Прежде чем создавать два файла, Android.mk и Application.mk. Android.mk предназначен для создания собственных библиотек (модулей), добавления флагов и т. Д. Вы можете создавать статические и разделяемые библиотеки в Android.mk. Когда вы создаете свои источники C, создается статическая библиотека (.a). Но эти библиотеки не используются на стороне Java. Их можно использовать только для создания разделяемых библиотек (.so). Для этого вы должны создать свои источники C ++, и если хотите, вы можете добавить к этому свои статические библиотеки.

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) ifneq (,$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86 arm64-v8a x86_64)) LOCAL_MODULE := myLibrary LOCAL_SHARED_LIBRARIES := cpufeatures opencv_imgproc opencv_core LOCAL_C_INCLUDES := $(LOCAL_PATH)/c-files LOCAL_SRC_FILES := $(LOCAL_PATH)/myJni.cpp include $(BUILD_SHARED_LIBRARY) 

— 1-я строка возвращает основной / jni-путь.

— 2-я строка очищает все старые LOCAL _ *** переменные.

— 3-строчные модули сборки для каждой арки, которые объявлены там.

— 4-я строка показывает имя модуля, когда вы его создаете, NDK автоматически добавляет к нему расширения lib и .so (libmyLibrary.so).

— 5-я строка добавляет другие разделяемые библиотеки, в которых вам нужны их источники в ваших родных источниках.

— 6-я строка добавляет файлы C в ваш модуль.

— 7-я строка показывает ваши источники C ++, которые вы пытаетесь создать.

— 8-я строка – это команда.

В Application.mk вы можете давать команды что-то вроде вашего проекта в режиме деблокирования или режиме отладки. И вы должны дать arch в этом файле. Например, APP_ABI := armeabi-v7a x86 arm64-v8a x86_64 и т. Д.

Когда вы пытаетесь создавать библиотеки и использовать их в java-стороне, вы должны выполнить некоторые операции.

1.Проверьте свой путь ndk в файле local.properties в папке проекта. Он показывает путь ndk-bundle для создания make-файлов.

ndk.dir=/Users/../Library/Android/sdk/ndk-bundle

2.Проверьте скрипты сборки в файле gradle. Этот скрипт показывает, где должны располагаться общие библиотеки:

 sourceSets.main { jni.srcDirs = [] jniLibs.srcDir 'src/main/libs' } 

3. И покажите свой путь к файлу makefile.

 externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } } 

Я думаю, что мой ответ поможет вам понять некоторые детали. Для добавления вы также можете посмотреть эти ответы.

  1. Для вызова собственных методов: Enter !
  2. Для связывания разделяемых библиотек: Enter !
  3. Ответ скопирован из моего другого ответа: Войдите !

Я думаю, что я воспроизвел ошибку в Android Studio, используя простой проект JNI. То, что вызвало эту конкретную ошибку («make: *** No target …»), для меня имело неправильный путь к одному из исходных файлов в Android.mk. (Если пути верны, сборка должна завершиться успешно, и если вы оставите исходный файл полностью, вы получите ошибку компоновщика.) Например, если я укажу неверный путь к одному из моих источников, эта ошибка возникает:

 make: *** No rule to make target `/Users/afarm/AndroidStudioProjects/Mktest/app/src/main/cp/stringdep.cpp', needed by `/Users/afarm/AndroidStudioProjects/Mktest/app/build/intermediates/ndkBuild/debug/obj/local/armeabi/objs-debug/native-lib/src/main/cp/stringdep.o'. Stop. 

Который выглядит как ошибка, описанная выше. Android.mk не находит ваш SerialPort.c, поэтому я бы предположил, что путь к SerialPort.c сохранен в Android.mk неверен. Имейте в виду, что пути, хранящиеся в Android.mk, относятся к самому файлу Android.mk, а не к корневому каталогу.

Intereting Posts
QGuiApplication останавливает цикл события, когда телефон блокируется при компиляции с Qt 5.3 или Qt 5.4 (но не с Qt 5.2) Android: лучше ли начинать и останавливать службу каждый раз, когда это необходимо, или разрешить запуск и привязку службы и привязать ее к ней? Лучший способ создать слайд-анимацию в Android-приложении? LG G2 vs980 не распознается командой устройств ADB (Win7 на виртуальном боксе) Метод отражения Android M freeStorageAndNotify исключение Попытка калибровки акселерометра AutoCompleteTextView – как отключить раскрывающееся меню, когда у нас есть одно точное соответствие после фильтрации? Возможная реализация с помощью ArrayList <custom-object> Как дескриптор EditText Change Listener в android WebView.zoomIn () не работает перед представлением рендеринга Создание ключей RSA в Android в формате PKCS # 1 на Android Как изменить размер захваченного изображения перед сохранением в sdcard? Как программно запускать событие touch в android? Вам нужно добавить значок в APK при загрузке приложения в Google Play Почему атрибут minHeight не работает в WebView Android?