Skip to content

打log

前面我们知道如何使用将字符串传入和传出本地(native)方法。

本文讲述如何在NDK中使用log。

打log是比较常见的一种调试手段。借助log我们可以了解应用运行的状态,获取到一些感兴趣的信息。

一般我们会用android.util.Log类来打log。比如Log.d(TAG, "RustFisher");

也可以直接在C++代码中使用log。

回头看字符串例子示例工程中的reverseString方法。

首先在CMakeLists.txt中,把log相关库log-lib引入。 第一步是find_library,填入log-lib。 最后是在target_link_libraries中,把log-lib和连接到我们的模块fisher-pole

find_library( # Defines the name of the path variable that stores the
        # location of the NDK library.
        log-lib

        # Specifies the name of the NDK library that
        # CMake needs to locate.
        log )

add_library( # Specifies the name of the library.
             fisher-pole

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             tom.cpp jerry.cpp baseparam.cpp)

target_link_libraries( # Specifies the target library.
        fisher-pole

        # Links the log library to the target library.
        ${log-lib} )

修改完CMakeLists.txt后,直接转向cpp文件。

文件添加引用和声明。

#include <android/log.h>

#define tag "rustApp"

调用int __android_log_print(int prio, const char* tag, const char* fmt, ...)方法打log。

jerry.cpp为例,在我们感兴趣的地方打上log

extern "C"
JNIEXPORT jstring JNICALL
Java_com_rustfisher_fishpole_worker_Jerry_reverseString(JNIEnv *env, jobject thiz, jstring input) {
    const char *inputPtr = env->GetStringUTFChars(input, NULL);
    int len1 = env->GetStringLength(input);
    int len2 = strlen(inputPtr);

    __android_log_print(ANDROID_LOG_INFO, tag, "[reverseString] input: %s", inputPtr);
    __android_log_print(ANDROID_LOG_INFO, tag, "[reverseString] GetStringLength: %d, strlen: %d",
                        len1, len2);

    char *out = new char[len1]{};

    __android_log_print(ANDROID_LOG_INFO, tag, "[reverseString] origin out: %s", out);

    for (int i = 0; i < len1; i++) {
        out[i] = inputPtr[len1 - i - 1];
    }

    __android_log_print(ANDROID_LOG_INFO, tag, "[reverseString] result: %s", out);
    jstring res = env->NewStringUTF(out);

    delete[] out;
    env->ReleaseStringChars(input, reinterpret_cast<const jchar *>(inputPtr));

    return res;
}

运行起来可以看到结果。

代码在这 https://github.com/AnRFDev/Tutorial2020