неопределенная ссылка на "печать журнала android"
что случилось с моим файлом make?
Андроид.МК
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
фу.c
#include <string.h>
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "foo"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
void test() {
LOGI("test");
}
ndk-build
foo.c:9: undefined reference to `__android_log_print'
12 ответов:
Если вы используете Android Studio и gradle, он игнорирует Android.mk добавьте это в свою сборку.файл gradle:
android { defaultConfig { ndk { moduleName "your_module_name" ldLibs "log" } } }
для Android Studio 2.2 и инструментов.сборка: gradle: 2.2.0 с помощью CMake добавьте или отредактируйте строку в CMakeLists.txt:
target_link_libraries(<your_library_name> android log)
это подключение библиотеки журналов к вашей.
Если вы обновляете до Android Studio 2.1, выше ответы не работают, нужно использовать ldLibs.добавить (), чтобы загрузить lib, как показано ниже:
android.ndk { moduleName = "[the_module_name]" ldLibs.addAll(['android', 'log']) }
мы можем связать общую библиотеку в Android в 3 стороны. В следующих 3 случаях указанные строки должны быть добавлены в
Android.mk
Итак, вот три способа.
1. LOCAL_LDLIBS way LOCAL_LDLIBS := -llog
по какой-то причине, если 1 не работает(это не сработало для меня), вы можете попробовать ниже 2 способа
2. LOCAL_LDFLAGS way LOCAL_LDFLAGS := -llog 3. LOCAL_SHARED_LIBRARIES way LOCAL_SHARED_LIBRARIES += liblog
конечно, вы также должны включать
#include <android/log.h>
в вашем файле C/H.
вместо с
Если вы используете новую интеграцию Gradle NDK в Android Studio 1.3, вам нужно добавить ldLibs = ["android", "log"] на свой android.варианты ndk-Stephen Kaiser 24 сентября в 4:20
использовать
ldLibs.addAll(["android", "log"])
для экспериментального плагина
да, вам нужно добавить:
LOCAL_LDLIBS := -llog
Как указано в других ответах / комментариях, однако в исходном вопросе не указано, использует ли он библиотеку jni как:LOCAL_JNI_SHARED_LIBRARIES
илиLOCAL_REQUIRED_MODULES
.я могу точно сказать, что он использовал его как:
LOCAL_REQUIRED_MODULES
из-заLOCAL_EXPORT_LDLIBS := -llog
в этом вопросе... если это было добавлено после редактирования.если вы используете
LOCAL_REQUIRED_MODULES
общая библиотека устанавливается в /system/lib, а не в apk, потому что это требуется модуль. Поэтому вам нужно будет добавить простоLOCAL_LDLIBS := -llog
Так что, когда система сборки строит и связывает общую библиотеку jni, она будет иметь-llog
определения в правильном месте, доступные для построения под$OUT/root/system/lib
. В противном случае вы будете продолжать получать тот же ответ, даже если вы только добавитьLOCAL_LDLIBS := -llog
.Итак, те, кто отметил, что
-L
не нужно, и другой ответ был правильным, они были на самом деле неверны в этой ситуации.
это помогло мне:
Андроид.МК
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := nativeDemo LOCAL_SRC_FILES := main.cpp LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)
в случае, если проектом вы работаете, имеет следующие характеристики, которые отличаются от других "стандартных" ответов:
- не используя Android Studio
- не используя gradle и интегрированный CMake
- нет Android.mk или Application.mk используется вообще для сборки
- используя CMake и toolchain напрямую (возможно, ваш проект основан на Qt и без использования QtCreator)
следующий target_link_libraries использование делает он:
find_library(ANDROID_LOG_LIB log) target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})
будучи
TARGET_NAME
имя цели для сборки (предварительно настроив ее с помощьюadd_library
илиadd_executable
).
find_library
не менее важно, а также правильно настроить набор инструментов (используйте набор инструментов, предоставленный Android SDK вANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
так он устанавливаетCMAKE_SYSROOT
используетсяfind_
команды).
в Android studio версии 2.2 и выше, есть встроенная поддержка CPP при создании нового проекта. Кроме того, liblog.so включен по умолчанию. Ничего не нужно делать, кроме включения файла заголовка (android / log.ч.)
проверка app / CMakeLists.txt, который создается студией при создании нового проекта android studio. Мы видим, что блок find_library() и блок target_link_libraries() для loglib уже присутствуют.
кроме того, обратите внимание к синтаксису функции. Это должно быть:
__андроид_журнал_печать (инт приоритет, const чарса *тег, константный тип char *фмт...);
в моем случае я оставил параметр тега и в конечном итоге потратил хорошие 3 дня на его выяснение.
подробнее о CMake, например: добавьте код C и C++ в свой проект