Как добавить .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 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 location instead of jniLibs
        jni.srcDirs = [] //disable automatic ndk-build call with auto-generated Android.mk
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }

Log:

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

Ответ 1

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

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

Затем убедитесь, что вы загружаете свои библиотеки в статическом поле перед любым собственным использованием в 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.

Настройки Android SDK

Ответ 2

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

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

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

Ответ 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, а не к корневому каталогу.

Ответ 4

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

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-я строка показывает ваши источники С++, которые вы пытаетесь создать.

--- 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. Этот script показывает, где должны быть расположены общие библиотеки:

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

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

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

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

  • Для вызова собственных методов: Enter!
  • Для связывания разделяемых библиотек: Enter!
  • Ответ скопирован из моего другого ответа: Enter!