tham chiếu không xác định đến `__android_log_print '


100

Có gì sai với tệp thực hiện của tôi?

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-build

foo.c:9: undefined reference to `__android_log_print'

Câu trả lời:


89

Hãy thử những điều sau trong Android.mktệp của bạn :

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

1
Điều gì là cần thiết để thêm điều này? Bạn vui lòng giải thích chi tiết?
Dhasneem

thêm của một thư viện Android để làm cho tập tin - và nó làm việc cho tôi quá
gheese

9
-L là không cần thiết. Hãy chấp nhận câu trả lời khác để thay thế.
Jeff Allen

5
Nếu sử dụng tích hợp Gradle NDK mới trong Android Studio 1.3, bạn cần phải thêm ldLibs = ["android", "log"]vào tùy chọn android.ndk của bạn
Stephen Kaiser

1
Điều gì sẽ xảy ra nếu chúng tôi không sử dụng Android.mk?
cagdas

99

Bạn cần phải thêm

LOCAL_LDLIBS := -llog

đến Android.mk


1
chính xác. nếu có nhiều thư viện, cần thêm câu lệnh này cho từng thư viện (sau khi XÓA VARS)
user13107

86

Nếu bạn sử dụng Android Studio và gradle, nó sẽ bỏ qua Android.mk. Thêm cái này vào tệp build.gradle của bạn:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}

7
Tôi tự hỏi nơi này được tài liệu. Tôi cũng đang tìm kiếm điều này.
Randy Sugianto 'Yuku'

1
Tôi đã nhận được "tham chiếu không xác định tới '__android_log_print'" trước khi tôi thêm ldLibs. Cảm ơn.
Denis Kniazhev

2
Thêm điều này đã sửa nó cho tôi. Chỉ cần đảm bảo thêm ndkphần trong build.gradle bên trong appthư mục thay vì phần trong thư mục dự án (tên mô-đun).
mathiass

Kể từ Gradle 2.5, sử dụng 'ldLibs + = "log"' thay đổi cú pháp nhẹ
Lorne K

15
điều này KHÔNG làm việc cho tôi. đây là những gì tôi phải làm:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

29

Đối với Android Studio 2.2 và tools.build:gradle:2.2.0 bằng cách sử dụng CMake thêm hoặc chỉnh sửa hàng trong CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

Đó là kết nối thư viện nhật ký với của bạn.


16

Nếu bạn nâng cấp lên Android Studio 2.1, các câu trả lời trên không hoạt động, cần sử dụng ldLibs.add () để tải lib như bên dưới:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}

(cuối 2017) Câu trả lời hiện đại nhất
Edgar Aroutiounian

7

Chúng tôi có thể liên kết thư viện được chia sẻ trong Android theo 3 cách. Trong 3 trường hợp dưới đây, các dòng được đề cập phải được thêm vàoAndroid.mk

Vì vậy, đây là ba cách.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Vì một số lý do nếu 1 không hoạt động (nó không hoạt động với tôi), Bạn có thể thử 2 cách dưới đây

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

Tất nhiên bạn cũng cần đưa #include <android/log.h> vào tệp C / H của mình.


6

Trong trường hợp dự án bạn đang thực hiện có các đặc điểm sau khác với các câu trả lời 'tiêu chuẩn' khác:

  • Không sử dụng Android Studio
  • Không sử dụng gradle và CMake tích hợp
  • Không có Android.mk hoặc Application.mk nào được sử dụng cho bản dựng
  • Sử dụng trực tiếp CMake và chuỗi công cụ (có thể dự án của bạn dựa trên Qt và không sử dụng QtCreator)

Việc sử dụng target_link_libraries sau đây làm cho nó:

    find_library(ANDROID_LOG_LIB log)
    target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})

TARGET_NAMEtên của mục tiêu cần xây dựng (đã thiết lập nó trước đó với add_libraryhoặc add_executable).

find_librarycũng không kém phần quan trọng cũng như thiết lập các toolchain đúng cách (sử dụng toolchain cung cấp bởi Android SDK tại ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakenên nó thiết lập CMAKE_SYSROOTđược sử dụng bởi find_lệnh).


Chỉ có giải pháp đã giúp tôi! Cảm ơn rất nhiều, tôi sẽ mở rộng nó bằng một bài kiểm tra nếu thư viện được tìm thấy để có phản hồi tốt hơn cho nhà phát triển như tại đây stackoverflow.com/a/37868829/10030695
ManuelTS

4

Có, bạn cần phải thêm: LOCAL_LDLIBS := -llognhư các câu trả lời / nhận xét khác đã chỉ định, tuy nhiên câu hỏi ban đầu không chỉ rõ liệu anh ta có sử dụng thư viện jni như: LOCAL_JNI_SHARED_LIBRARIEShay như LOCAL_REQUIRED_MODULES.

Tôi có thể nói chắc chắn rằng anh ấy đã sử dụng nó như là: LOCAL_REQUIRED_MODULESLOCAL_EXPORT_LDLIBS := -llog trong câu hỏi ... trừ khi nó được thêm vào sau khi chỉnh sửa.

Nếu bạn sử dụng LOCAL_REQUIRED_MODULESthư viện chia sẻ được cài đặt trong / system / lib thay vì vào apk, vì nó là một mô-đun bắt buộc. Do đó, bạn sẽ cần phải thêm LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogthay vì chỉ LOCAL_LDLIBS := -llogđể khi hệ thống xây dựng đang xây dựng và liên kết thư viện chia sẻ jni, nó sẽ có các -llogđịnh nghĩa ở đúng vị trí, có sẵn để xây dựng $OUT/root/system/lib. Nếu không, bạn sẽ tiếp tục nhận được câu trả lời tương tự, ngay cả khi bạn chỉ thêm LOCAL_LDLIBS := -llog.

Vì vậy, những người nhận xét rằng -Lcâu trả lời là không cần thiết, và câu trả lời khác là đúng, họ thực sự đã sai trong tình huống này.


Cảm ơn bạn đã thực sự giải thích những gì đang xảy ra!
Richard

4

Thay cho

Nếu sử dụng tích hợp Gradle NDK mới trong Android Studio 1.3, bạn cần thêm ldLibs = ["android", "log"] vào tùy chọn android.ndk của mình - Stephen Kaiser 24 tháng 9 lúc 4:20

sử dụng ldLibs.addAll(["android", "log"])cho plugin thử nghiệm


3

Thêm vào

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

đến Android.mk


2
Tại sao? Vui lòng giải thích lý do tại sao câu trả lời này phù hợp với người hỏi.
L0j1k

1

Điều này đã giúp tôi:

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)

0

Trong phiên bản Android studio 2.2 trở lên, có hỗ trợ sẵn cho CPP khi bạn tạo một dự án mới. Ngoài ra, liblog.so được bao gồm theo mặc định. Không có gì phải làm ngoài việc bao gồm tệp tiêu đề (android / log.h).

Ứng dụng Checkout / CMakeLists.txt được tạo bởi studio khi chúng tôi tạo dự án studio android mới. Chúng ta có thể thấy rằng khối find_library () và khối target_link_libraries () cho loglib đã có sẵn.

Ngoài ra, hãy chú ý đến cú pháp hàm. Nó phải là:

__android_log_print (int ưu tiên, thẻ const char *, const char * fmt, ...);

Trong trường hợp của tôi, tôi đã bỏ qua thông số thẻ và cuối cùng đã dành 3 ngày tốt để tìm ra nó.

Thông tin thêm về CMake: Thêm mã C và C ++ vào dự án của bạn



0

thêm LOCAL_SHARED_LIBRARIES:= liblog vào Android.mk có thể giải quyết vấn đề của tôi. Điều này là do __android_log_printđược định nghĩa trong libLog


0

ĐỂ xây dựng với Android.bp, hãy làm theo giải pháp dưới đây:

Trong điều này - android_log_print được định nghĩa bằng NDK, vì vậy đối với điều này, đã có sẵn một thư viện. Sử dụng thư viện " liblog " bằng thẻ shared_libs , tham khảo đoạn mã dưới đây:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.