Я долгое время программист, но новичок в Android Studio. Я унаследовал некоторый существующий код библиотеки JNI, предназначенный для запуска с ndk-build, у которого уже есть файл Android.mk. Было бы хорошо повторить это. Когда я открыл новый проект с Android Studio и установил флаг поддержки C++, он решил использовать CMake вместо ndk-build. Документация для Android Studio говорит, что оба доступны, поэтому я решил попробовать простой тест, чтобы узнать, нашли ли я все места, которые необходимо изменить. Это был полный сбой с сообщениями об ошибках, которые, кажется, ни к чему не приводят.Как преобразовать простой пример jni из Cmake в ndk-build?
Чтобы воссоздать, создайте новый проект ProjTest2 с Android Studio и установите флажок Включить поддержку C++. Примите стандартный форм-фактор телефона и планшета с минимальным SDK API 16: Android 4.1. Выберите Пустое действие. Примите имена и имена объектов по умолчанию. Примите стандартную Toolchain и не установите флажки для поддержки исключений или времени выполнения. Запустите программу, выберите устройство Android Emulator Nexus_5_API_24: 5554. Все хорошо; get message Привет из C++ на экране эмулятора.
Попытка изменить на ndk-build. Откройте файл build.grade для модуля: приложение. Заменить строки:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
с:
externalNativeBuild {
ndkBuild {
path "jni/Android.mk"
}
}
Создать новую папку JNI в каталоге ProjTest2/приложения. Создайте файл Android.mk в этой папке со следующим содержимым:
# A simple test for the minimal standard C++ library
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := $(LOCAL_PATH)/../src/main/cpp/native-lib.cpp
LOCAL_LDLIBS := -llog -landroid
include $(BUILD_SHARED_LIBRARY)
Строить в настоящее время терпит неудачу, утверждая, что он не может найти цель #include < строки > и что он не может разрешить контейнер 'зЬй. Я обнаружил, что я могу очистить флаги ошибки IDE, добавив в Android LOCAL_C_INCLUDES + = C: \ Users \ JWC \ AppData \ Local \ Android \ sdk \ ndk-bundle \ sources \ cxx-stl \ gnu-libstdC++ \ 4.9 \ include .mk, но полученный результат все еще терпит неудачу, когда он не может найти некоторые из вспомогательных элементов из строки < >.
Я пропустил что-то простое, или это не так просто, как кажется?
Edit:
необходимо также файл:
# Application.mk
APP_ABI := armeabi-v7a armeabi
APP_PLATFORM := android-21
APP_OPTIM := release
APP_STL := gnustl_static
Добавление этой линии, кажется, не имеет эффекта. Класс include и класс по-прежнему не определены. Я положил строку сразу после строки $ (CLEAR_VARS). Важно ли размещение? – JackOfAllTrades
Как говорится в моем ответе, он должен идти в Application.mk. –
Да, я вижу. Я вообще пропустил Application.mk. Добавление файла, отмеченного в изменении исходного вопроса, было исправлено. Благодарю. – JackOfAllTrades