Ответ 1
Попробуйте следующее в файле Android.mk
:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Что случилось с моим файлом make?
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
foo.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-сборка
foo.c:9: undefined reference to `__android_log_print'
Попробуйте следующее в файле Android.mk
:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Вам нужно добавить
LOCAL_LDLIBS := -llog
на Android.mk
Если вы используете Android Studio и gradle, он игнорирует Android.mk. Добавьте это в свой файл build.gradle:
android {
defaultConfig {
ndk {
moduleName "your_module_name"
ldLibs "log"
}
}
}
Если вы перейдете на Android Studio 2.1, ответы выше не работают, вам нужно использовать ldLibs.add() для загрузки lib, как показано ниже:
android.ndk {
moduleName = "[the_module_name]"
ldLibs.addAll(['android', 'log'])
}
Для Android Studio 2.2 и tools.build: gradle:2.2.0, используя CMake добавить или изменить строку в CMakeLists.txt:
target_link_libraries(<your_library_name>
android
log)
Это соединение библиотеки журналов с вашим.
Мы можем связать общую библиотеку в Android тремя способами.
В ниже 3 случаях указанные строки следует добавить в Android.mk
Итак, вот три способа.
1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog
По какой-то причине, если 1 не работает (это не сработало для меня), вы можете попробовать менее двух способов
2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog
3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog
Конечно, вам также нужно включить #include <android/log.h>
в ваш файл C/H.
Вместо
Если вы используете новую интеграцию NDK Gradle в Android Studio 1.3, вам нужно добавить ldLibs = [ "android", "log" ] к вашим параметрам android.ndk - Stephen Kaiser Sep 24 at 4:20
используйте ldLibs.addAll(["android", "log"])
для экспериментального плагина
Добавить
LOCAL_SHARED_LIBRARIES:= \
libbinder \
liblog \
на Android.mk
Да, вам нужно добавить: 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 := -L$(SYSROOT)/usr/lib -llog
вместо просто LOCAL_LDLIBS := -llog
, чтобы при сборке и компоновке jni-разделяемой библиотеки она имела определения -llog
в правильном месте, доступное для построения в $OUT/root/system/lib
. В противном случае вы продолжите получать тот же ответ, даже если вы добавите LOCAL_LDLIBS := -llog
.
Итак, те, кто прокомментировал, что -L
не нужны, и другой ответ был прав, в действительности они были неверными.
Это помогло мне:
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nativeDemo
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
В студии Android версии 2.2 и выше встроенная поддержка CPP при создании нового проекта. Кроме того, liblog.so включен по умолчанию. Ничего не нужно делать, кроме заголовочного файла (android/log.h).
Приложение Checkout/CMakeLists.txt, созданное студией при создании нового проекта студии Android. Мы видим, что блок find_library() и блок target_link_libraries() для loglib уже присутствуют.
Также обратите внимание на синтаксис функции. Это должно быть:
__ android_log_print (int priority, const char * tag, const char * fmt,...);
В моем случае я оставил параметр тега и в итоге потратил 3 дня на то, чтобы понять его.
Подробнее о CMake: Добавить код C и С++ в ваш проект
Если проект, над которым вы работаете, имеет следующие характеристики, которые отличаются от других "стандартных" ответов:
Следующий 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_
).