web-dev-qa-db-ja.com

`__Android_log_print 'への未定義の参照

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

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'
95
alex2k8

Android.mkファイル:

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

追加する必要があります

LOCAL_LDLIBS := -llog

android.mkへ

96
Kyle

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

Android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
83
BoredT

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

target_link_libraries(<your_library_name> 
                      Android 
                      log)

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

29
lewkka

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

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

共有ライブラリを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

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

6
mk..

の代わりに

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

実験プラグインにldLibs.addAll(["Android", "log"])を使用します

4
sethbabs

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

  • 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 at Android_SDK_HOME/cmake/<version>/Android.toolchain.cmakeで提供されるツールチェーンを使用して、CMAKE_SYSROOTをセットアップします。 find_コマンドによる)。

3
DNax

追加

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

android.mkへ

3
user3535040

これは私を助けました:

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)
1
NickUnuchek

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

新しいAndroid 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