android-studio - Android studio 2.3.2上JNI编译错误

标签 android-studio compiler-errors java-native-interface

我正在申请将电话视频广播到 youtube channel 。我找到了这个链接https://github.com/youtube/yt-watchme .

编译代码时出现错误

libavutil not found in file avecode.h at code #include "libavutil/samplefmt.h

我也更改为#include“../libavutil/samplefmt.h”仍然是同样的错误。

也许建议任何好的rtmp库来将手机视频播放到youtube channel 。

Error:FAILURE: Build failed with an exception. * What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
Build command failed.
Error while executing process

/Users/nomankhan/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /Clients/Ankur/JniDemo/app/.externalNativeBuild/cmake/debug/mips64 --target native-lib}
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
FAILED: /Users/nomankhan/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=mips64el-none-linux-android --gcc-toolchain=/Users/nomankhan/Library/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/nomankhan/Library/Android/sdk/ndk-bundle/sysroot -Dnative_lib_EXPORTS -I../../../../src/main/cpp/include/libavcodec -I../../../../src/main/cpp/include/libavformat -I../../../../src/main/cpp/include/libavutil -isystem /Users/nomankhan/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /Users/nomankhan/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips64/include -isystem /Users/nomankhan/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/backward -isystem /Users/nomankhan/Library/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 -fPIC -MD -MT CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -MF CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Clients/Ankur/JniDemo/app/src/main/cpp/native-lib.cpp

In file included from /Clients/Ankur/JniDemo/app/src/main/cpp/native-lib.cpp:4: /Clients/Ankur/JniDemo/app/src/main/cpp/libavcodec/avcodec.h:31:10: fatal error: 'libavutil/samplefmt.h' file not found #include "libavutil/samplefmt.h" ^~~~~~~~~~~~~~~~~~~~~~~

我的CMakeLists.txt

 cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

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.
                       native-lib

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

include_directories(src/main/cpp/include/libavcodec)

include_directories(src/main/cpp/include/libavformat)

include_directories(src/main/cpp/include/libavutil)

最佳答案

下面的答案是假设 cpp 中的文件夹包含 C++ 代码/src 文件。如果没有,那么您可能存在代码和库结构问题。

简单地调用include_directories不会CMake编译它们,我相信它只会帮助IDE进行某些“语法突出显示”和编码相关的事情,但这很重要。

相反,您需要在 add_library 调用中包含代码文件。由于很明显您有很多文件,因此这样的遍历代码将有所帮助:

cmake_minimum_required(VERSION 3.4.1)

include_directories(src/main/cpp/include/libavcodec)        

# Traverses through the directories recursively 
# and append matching files to variable my_lib_SRC
file(GLOB_RECURSE my_lib_SRC
    "src/main/cpp/*.h"
    "src/main/cpp/*.cpp"
)

add_library( # Sets the name of the library.
         native-lib

         # Sets the library as a shared library.
         SHARED

         # Provides a relative path to your source file(s).
         ${my_lib_SRC})

target_link_libraries( # Specifies the target library.
                       native-lib

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

注意:每次添加新的源/代码文件时,您都需要清理并再次构建项目才能正确构建二进制文件。进一步的解释可以在这里找到:https://stackoverflow.com/a/17655165/2949966

关于android-studio - Android studio 2.3.2上JNI编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46251462/

相关文章:

Android ProductFlavor 名称 'plus' 不起作用

java - 在 Java 中使用 native 代码

java - Android Studio 线程调试

断开辅助显示后 Android Studio 不显示

c# - 如何在 C# 中获取表的 innerHTML

regex - msys2中的regex.h(Windows)

c - 为队列实现删除函数时出现原型(prototype)声明错误

java - 使用 JNI 创建、填充和返回 Java 类实例

android - 我们如何将动画/简单图像添加为视频的顶层并将其导出为 Android 中的单个视频?

android - 外部库与 libs 文件夹