`__android_log_print 'への未定義の参照


5 Answers

あなたは追加する必要があります

LOCAL_LDLIBS := -llog

Android.mkへ

Question

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

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



追加

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

Android.mkへ




3つの方法でAndroidの共有ライブラリをリンクできます。 以下の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

もちろん、C / Hファイルに#include <android/log.h>を含める必要もあります。




アンドロイドスタジオバージョン2.2以上では、新しいプロジェクトを作成するときにCPPのサポートが組み込まれています。 また、liblog.soもデフォルトで含まれています。 ヘッダファイル(android / log.h)をインクルードすること以外は何もしないでください。

新しいアンドロイドスタジオプロジェクトを作成するときにスタジオによって作成されるappout / CMakeLists.txtをチェックアウトします。 loglibのfind_library()ブロックとtarget_link_libraries()ブロックはすでに存在しています。

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

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

私の場合、私はタグのパラメータを捨てて、それを見つけ出すのに良い3日間を過ごした。

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




これは私にとって助けになりました:

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およびtools.build:gradle:2.2.0用CMakeの使用CMakeLists.txtの行の追加または編集:

target_link_libraries(<your_library_name> 
                      android 
                      log)

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




Related