`__android_log_print 'への未定義の参照


100

私のメイクファイルの何が問題になっていますか?

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'

回答:


89

Android.mkファイルで次のことを試してください。

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

1
これを追加するには何が必要ですか?詳しく説明していただけますか?
ダスニーム2013年

Androidライブラリをmakeファイルに追加し、それが私にとっても
うまくいった

9
-Lは不要です。代わりに他の回答を受け入れてください。
ジェフアレン

5
Android Studio 1.3で新しいGradle NDK統合を使用している場合はldLibs = ["android", "log"]、android.ndkオプションに追加する必要があります
Stephen Kaiser

1
Android.mkを使用していない場合はどうなりますか?
cagdas

99

追加する必要があります

LOCAL_LDLIBS := -llog

Android.mk


1
正しい。複数のライブラリがある場合は、ライブラリごとにこのステートメントを追加する必要があります(CLEAR VARSの後)
user13107

86

Android StudioとGradleを使用している場合、Android.mkは無視されます。これをbuild.gradleファイルに追加します。

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

7
これはどこに文書化されているのでしょうか。これも探していました。
Randy Sugianto 'Yuku'

1
追加する前に、「未定義の「__android_log_print」への参照」が表示されていましたldLibs。ありがとう。
Denis Kniazhev 2015年

2
これを追加することで修正されました。プロジェクトフォルダー(モジュール名)のndkパーツではappなく、フォルダー内のbuild.gradleにパーツを追加してください。
マティアス

Gradle 2.5以降では、「ldLibs + = "log"」のわずかな構文変更を使用
Lorne K

15
これは私にはうまくいきませんでした。これは私がしなければならなかったものです:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

29

Android Studio 2.2およびtools.build:gradle:2.2.0の場合、CMakeを使用して、CMakeLists.txtの行を追加または編集します。

target_link_libraries(<your_library_name> 
                      android 
                      log)

それはあなたにあなたのログライブラリを接続します。


16

Android Studio 2.1にアップグレードした場合、上記の回答は機能しません。ldLibs.add()を使用して、以下のようにlibをロードする必要があります。

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

ベストモダン(2017年後半)の回答
エドガーアロウティオニアン

7

Androidで共有ライブラリをリンクするには、3つの方法があります。以下の3つのケースでは、上記の行を追加する必要がありますAndroid.mk

これが3つの方法です。

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ファイルに含める必要もあります。


6

作業中のプロジェクトに、他の「標準」の回答とは異なる次の特性がある場合:

  • Android Studioを使用していない
  • Gradleと統合されたCMakeを使用しない
  • ビルドにAndroid.mkやApplication.mkをまったく使用していません
  • CMakeとツールチェーンを直接使用する(おそらくプロジェクトは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_SYSROOTfind_


私を助けた唯一の解決策!おかげで、開発者へのより良いフィードバックのためにライブラリが見つかった場合は、テストで拡張します。ここでは、stackoverflow.com
a / 37868829/10030695

4

はい、あなたが追加する必要があります:LOCAL_LDLIBS := -llog:他の回答/コメントが指定されているとして、彼のようにJNIライブラリを使用する場合は、しかし、元の質問には、指定されていませんでしたLOCAL_JNI_SHARED_LIBRARIESかのようにLOCAL_REQUIRED_MODULES

:私はかなり彼はそれとしてそれを使用していることを確認するために言うことができるLOCAL_REQUIRED_MODULESためのLOCAL_EXPORT_LDLIBS := -llog ...それが編集後に追加されない限り。

LOCAL_REQUIRED_MODULES共有ライブラリを使用する場合、それは必須モジュールであるため、apkではなく/ system / libにインストールされます。したがって、ビルドシステムがjni共有ライブラリをビルドしてリンクしているときに、正しい場所に定義があり、でビルドできるように、LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog代わりに追加する必要があります。それ以外の場合は、追加するだけでも、同じ答えを取得し続けますLOCAL_LDLIBS := -llog-llog$OUT/root/system/libLOCAL_LDLIBS := -llog

だから、これ-Lは必要ない、と他の答えは正しかったとコメントした人たちは、この状況では実際には正しくありませんでした。


何が起こっているのか実際に説明していただきありがとうございます!
Richard

4

の代わりに

Android Studio 1.3で新しいGradle NDK統合を使用する場合は、ldLibs = ["android"、 "log"]をandroid.ndkオプションに追加する必要があります– Stephen Kaiser 9月24日4:20

ldLibs.addAll(["android", "log"])試験的なプラグインに使用



1

これは私に役立ちました:

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

Android Studioバージョン2.2以降では、新しいプロジェクトを作成するときにCPPのサポートが組み込まれています。また、liblog.soはデフォルトで含まれています。ヘッダーファイル(android / log.h)をインクルードする以外は何もする必要はありません。

新しいAndroid Studioプロジェクトを作成するときにStudioによって作成されるチェックアウトapp / CMakeLists.txt。loglibのfind_library()ブロックとtarget_link_libraries()ブロックがすでに存在していることがわかります。

また、関数の構文にも注意してください。そのはず:

__android_log_print(int priority、const char * tag、const char * fmt、...);

私の場合、私はタグパラメータを省略し、それを理解するために3日間を費やしてしまいました。

CMakeの詳細:プロジェクトにCおよびC ++コードを追加する



0

LOCAL_SHARED_LIBRARIES:= liblog Android.mkに追加 すると、私の問題を解決できます。これは__android_log_printlibLogで定義されているためです


0

Android.bpでビルドするには、以下のソリューションに従ってください:

この-android_log_printはNDKで定義されているため、このために、すでにライブラリが利用可能です。shared_libsタグを使用して「liblog」ライブラリを使用し、以下のコードを参照してください:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.