неопределенная ссылка на "печать журнала 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 89

12 ответов:

попробуйте следующее в вашем Android.mk file:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

вам нужно добавить

LOCAL_LDLIBS := -llog

to Android.mk

Если вы используете 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_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

to 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 := -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++ в свой проект