Можно ли создать проект только для CMake для Android Studio? - PullRequest
0 голосов
/ 01 мая 2018

У меня есть проект «MyLib.aar», который создает мой повторно используемый модуль для нескольких приложений Android. Моя библиотека связывается с некоторым собственным кодом C ++ в libMyNative.so, который собран с помощью ndk-build.

Я бы хотел заменить ndk-build на Android Studio CMake, чтобы собрать свой собственный код в соответствии с текущими стандартами. Собственный код создается ОЧЕНЬ редко, и я не хочу обременять 'MyLib.aar' более длительным временем сборки, так как он собирается очень часто.

Похоже, практически нет документации, описывающей этот тип процедуры сборки. Единственная вещь, о которой говорится в официальной документации Android, гласит, что нужно создать новый проект Android Studio (приложение) с поддержкой C ++, а затем грохнуть его файл 'CMakeLists.txt', пока он (как побочный продукт) не сгенерирует то, что вы хотите.

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

Возможно ли это? И если да, то как?

1 Ответ

0 голосов
/ 03 мая 2018

Да! CMake работает в Android Studio так же, как и везде. Все «специальные переменные среды» прямо здесь, в документации Android

так что единственное, что вы захотите получить от чистого нативного приложения, это

# build native_app_glue as a static lib
set(APP_GLUE_DIR ${ANDROID_NDK}/sources/android/native_app_glue)
include_directories(${APP_GLUE_DIR})
add_library( app-glue STATIC ${APP_GLUE_DIR}/android_native_app_glue.c)
...
target_link_libraries(MyLibrary app-glue)

Кроме того, любые другие детали, которые вам нужны, - это больше вопросов CMake, чем NDK. Также обратите внимание, что вы можете передавать аргументы через Gradle

externalNativeBuild {
    cmake {
       abiFilters 'armeabi-v7a', 'arm64-v8a'
       arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
    }
}

ЛУЧШЕЕ РЕДАКТИРОВАНИЕ - Я понял, что вопрос был нацелен на загрузку библиотеки c ++ во время выполнения из Java / Kotlin.

Здесь вы хотите убедиться, что ваше приложение build.gradle имеет

externalNativeBuild {
     cmake {
        path "CMakeLists.txt"
    }
}

В твоем cmake ты все еще хочешь

add_library( MyNative SHARED
${NATIVE_SRC}/myCode.cpp)
...
target_link_libraries(MyNative otherNativeLibraries)

Затем вы просто загружаете его с помощью Java (не уверен, что для Kotlin)

System.loadLibrary("MyNative");

Отсюда вопрос создания вызовов JNI (опять-таки не уверенных в Kotlin) для подключения к вашей библиотеке libMyNative.so, МНОГО подробнее об этом здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...