在創(chuàng)建工程時,勾選Include C++ support,IDE會自動生成一個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頭文件內容如下:
#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__)
這時候可以正常打印log:
04-05 21:26:40.953 2751-2751/? I/FFmpeg: native-lib.cpp | Hello, world
我又新建了一個名為FFmpeg.cpp的文件,內容如下:
# 這是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,就會報錯:
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()");這一行,就不會報錯了。
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
這個問題太詭異了,我弄了一天也沒有頭緒,如果有大神知道解決的辦法,請告訴我,感激不盡!
CMAKELIST 將你自己的cpp與log庫鏈接起來
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 (你自己的庫)
# Links the target library to the log library
# included in the NDK.
${log-lib} )北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。