webdevqa.jp.net

Android JNIプログラムから呼び出すLog APIは何ですか?

Logcatにログメッセージを挿入して、JNI Cアプリケーションをデバッグしたいと思います。これを行うC APIとは何ですか?

52
hopia

このような:

#include <Android/log.h>


__Android_log_write(Android_LOG_ERROR, "Tag", "Error here");//Or Android_LOG_INFO, ...  

次のようにメイクファイルに追加します。

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

以下は、ネイティブコードに含める必要があるコードスニペットです。

#include <Android/log.h>


__Android_log_write(Android_LOG_ERROR, "Tag", "Error msg");//Or Android_LOG_INFO, ...  

上記のAPIを使用するには、対応するライブラリをリンクする必要があります。

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

syslog

このPOSIX関数はlogcatにも出力します。

これには、非Androidシステムよりも__Android_log_writeそして、アプリパッケージをログに自動的に追加します。

このサンプルアプリでテスト済み: https://github.com/cirosantilli/Android-cheat/tree/a080f5c370c1f06e74a8300fb4a2e93369861047/gradle/NdkSyslog NDKソース:

#include <jni.h>
#include <string>
#include <syslog.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_cirosantilli_Android_1cheat_ndksyslog_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    syslog(LOG_CRIT, "hello syslog");
    return env->NewStringUTF("Check adb logcat");
}

また、logcatには次が含まれます。

01-14 15:39:07.582  3633  3633 E com.cirosantilli.Android_cheat.ndksyslog: hello syslog  

テスト済みAndroid O、HiKey 960。