鍍金池/ 問(wèn)答/Android/ Android jni中打印log報(bào)錯(cuò)undefined reference t

Android jni中打印log報(bào)錯(cuò)undefined reference to `__android_log_print'

在創(chuàng)建工程時(shí),勾選Include C++ support,IDE會(huì)自動(dòng)生成一個(gè)native-lib.cpp的文件,在native-lib.cpp文件里打印log是正常的。

#include <jni.h>
#include <string>
#include "android_log.h"

extern "C"
JNIEXPORT jstring JNICALL
Java_org_ffmpeg_MainActivity_stringFromJNI(JNIEnv* env, jobject /* this */) {
    std::string hello = "Hello from C++";
    LOGI("native-lib.cpp | Hello, world");
    return env->NewStringUTF(hello.c_str());
}

引入的android_log.h頭文件內(nèi)容如下:

#include <android/log.h>
#ifndef LOG_TAG
    #define LOG_TAG "FFmpeg"
#endif
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

這時(shí)候可以正常打印log:


04-05 21:26:40.953 2751-2751/? I/FFmpeg: native-lib.cpp | Hello, world

我又新建了一個(gè)名為FFmpeg.cpp的文件,內(nèi)容如下:

# 這是FFmpeg.cpp的代碼
#include <jni.h>
#include <string>
#include "android_log.h"

extern "C"
JNIEXPORT jint JNICALL
Java_org_ffmpeg_FFmpeg_exec(JNIEnv* env, jobject /* this */, jstring cmd) {
    LOGI("FFmpeg.cpp | exec()");
    return 12345;
}

在FFmpeg.cpp文件里打印Log,就會(huì)報(bào)錯(cuò):

Build command failed.
Error while executing process D:\Android_SDK\cmake\3.6.4111459\bin\cmake.exe with arguments {--build D:\workspace_as\FFmpeg\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}
[1/3] Building CXX object CMakeFiles/ffmpeg.dir/src/main/cpp/ffmpeg.cpp.o
[2/3] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\mips64\libffmpeg.so
FAILED: cmd.exe /C "cd . && D:\Android_SDK\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=mips64el-none-linux-android --gcc-toolchain=D:/Android_SDK/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64 --sysroot=D:/Android_SDK/ndk-bundle/sysroot -fPIC -isystem D:/Android_SDK/ndk-bundle/sysroot/usr/include/mips64el-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fintegrated-as -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a --sysroot D:/Android_SDK/ndk-bundle/platforms/android-21/arch-mips64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libffmpeg.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\mips64\libffmpeg.so CMakeFiles/ffmpeg.dir/src/main/cpp/ffmpeg.cpp.o  -lm "D:/Android_SDK/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips64/libgnustl_static.a" && cd ."
CMakeFiles/ffmpeg.dir/src/main/cpp/ffmpeg.cpp.o: In function `Java_org_ffmpeg_FFmpeg_exec':
D:\workspace_as\FFmpeg\app\src\main\cpp/ffmpeg.cpp:9: undefined reference to `__android_log_print'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

只要一去掉LOGI("FFmpeg.cpp | exec()");這一行,就不會(huì)報(bào)錯(cuò)了。

04-05 21:33:17.432 3356-3356/? I/FFmpeg: native-lib.cpp | Hello, world
04-05 21:33:17.432 3356-3356/? I/FFmpeg: MainActivity.java | 從FFmpeg.exec()中返回的值為:12345

這個(gè)問(wèn)題太詭異了,我弄了一天也沒(méi)有頭緒,如果有大神知道解決的辦法,請(qǐng)告訴我,感激不盡!

回答
編輯回答
憶當(dāng)年

CMAKELIST 將你自己的cpp與log庫(kù)鏈接起來(lái)

find_library( # Sets the name of the path variable.

          log-lib

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

target_link_libraries( # Specifies the target library.

                   test.lib  (你自己的庫(kù))

                   # Links the target library to the log library
                   # included in the NDK.
                   ${log-lib} )
2017年4月22日 18:58