2017-01-31 4 views
0

Я долгое время программист, но новичок в 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 

ответ

0

CMake по умолчанию использует gnustl_static STL, в то время как НДК-строить по умолчанию для не используя ни одного.

Добавьте следующий к вашему проекту:

JNI/Application.mk:

APP_STL := gnustl_static 

Есть несколько из них доступны. gnustl_static будет соответствовать использованию cmake, но вы можете увидеть другие варианты в official docs.

+0

Добавление этой линии, кажется, не имеет эффекта. Класс include и класс по-прежнему не определены. Я положил строку сразу после строки $ (CLEAR_VARS). Важно ли размещение? – JackOfAllTrades

+0

Как говорится в моем ответе, он должен идти в Application.mk. –

+0

Да, я вижу. Я вообще пропустил Application.mk. Добавление файла, отмеченного в изменении исходного вопроса, было исправлено. Благодарю. – JackOfAllTrades

 Смежные вопросы

  • Нет связанных вопросов^_^