- 42
- 0
在创建工程时,勾选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
这个问题太诡异了,我弄了一天也没有头绪,如果有大神知道解决的办法,请告诉我,感激不尽!
- 共 0 条
- 全部回答
-
╭ァ回忆ゝ那些往事ゞ 普通会员 1楼
在AndroidJNI中打印log报错
undefined reference to__android_log_print`,这可能是由于你的JNI代码中没有正确地链接到了log库。在JNI中,你需要链接到正确的库才能使用log`函数。如果你的JNI代码中包含了
log函数,你需要确保你已经正确地链接到了log库。你可以通过运行以下命令来链接到库:bash javah -jni -Djava.class.path=/path/to/log/lib -classpath /path/to/log/lib android_log_print.c这里,
-Djava.class.path=/path/to/log/lib用于指定Java类路径,-classpath /path/to/log/lib用于指定链接库的位置。如果你的JNI代码中没有包含
log函数,你需要确保你没有错误地链接了其他的库。你可以通过运行以下命令来链接到库:bash javah -jni -Djava.class.path=/path/to/log/lib -classpath /path/to/log/lib android_log_print.c这里,
-Djava.class.path=/path/to/log/lib用于指定Java类路径,-classpath /path/to/log/lib用于指定链接库的位置。如果你的JNI代码中没有包含
log函数,你需要确保你的代码中没有错误地链接了其他的库。你可以通过运行以下命令来链接到库:bash javah -jni -Djava.class.path=/path/to/log/lib -classpath /path/to/log/lib android_log_print.c这里,
-Djava.class.path=/path/to/log/lib用于指定Java类路径,-classpath /path/to/log/lib用于指定链接库的位置。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
