大楼+;将Android Studio中的libpng与Windows上的CMake链接

大楼+;将Android Studio中的libpng与Windows上的CMake链接,android,android-studio,cmake,Android,Android Studio,Cmake,我正试图在Windows10上用Android Studio和CMake启动一个本地应用程序项目,但我一直坚持要包括libpng 首先,这是我第一次看到CMakeLists.txt文件。我花了一天的时间才弄明白target\u link\u库(本机活动…png)不可能是target\u link\u库(png本机活动…,因为所有错误消息都是关于没有创建文件以及由于缺少工具链的要求而导致命令失败(为什么重要的错误出现在列表的末尾?不酷!) 在最终设法将libpng包括在项目中之后,我现在得到一个构

我正试图在Windows10上用Android Studio和CMake启动一个本地应用程序项目,但我一直坚持要包括libpng

首先,这是我第一次看到CMakeLists.txt文件。我花了一天的时间才弄明白
target\u link\u库(本机活动…png)
不可能是
target\u link\u库(png本机活动…
,因为所有错误消息都是关于没有创建文件以及由于缺少工具链的要求而导致命令失败(为什么重要的错误出现在列表的末尾?不酷!)

在最终设法将libpng包括在项目中之后,我现在得到一个构建错误:

Error:Execution failed for task ':app:externalNativeBuildDebug'.
...
error: unknown target CPU 'armv5te'
CMake Error at scripts/genout.cmake:78 (message):
    Failed to generate
    C:/APP_PATH/app/libpng-1.6.28/build/scripts/symbols.out.tf1
ninja: build stopped: subcommand failed.
我递归地搜索了我的项目、.android、.AndroidStudio2.2目录以及文件名,除了genout.cmake之外,在armv5te中找不到任何东西。我的abiFilters行是
abiFilters'x86'

如何构建libpng以链接到我的原生应用程序?此外,在Android Studio中,它显示项目现在包含libpng源文件(不少于9个项目专用于它!)。有没有办法删除它

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

# build native_app_glue as a static lib
add_library(app-glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)

set(png_src_dir ../../../../libpng-1.6.28)
set(PNG_STATIC ON)
add_subdirectory(${png_src_dir} ${png_src_dir}/build)

# now build app's shared lib
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14")

add_library(native-activity SHARED
            main.cpp logger.cpp logger.h game.cpp game.h
            shaders.cpp shaders.h assets.cpp assets.h)

target_include_directories(native-activity PRIVATE ${ANDROID_NDK}/sources/android/native_app_glue
                           C:/devlibs/include
                           ${png_src_dir})

# add lib dependencies
target_link_libraries(native-activity app-glue android log EGL GLESv2 png)

我已经管理libpng将android NDK应用程序(CMake build system而不是android.mk)作为静态库使用。我使用了。我做了以下几件事:

  • git克隆https://github.com/julienr/libpng-android.git
    进入
    ${YOUR_LIBS_FOLDER}
    (我使用了
    ${ANDROID\u NDK\u ROOT\u DIRECTORY}/sources/ANDROID
  • ${ANDROID\u NDK\u ROOT\u DIRECTORY}
    home/username/ANDROID/sdk/NDK bundle
    为我)添加到全局
    $PATH
    变量中,该变量是构建脚本所需的变量)
  • 使用
    ndk Build
    构建lib(在带有lib的目录中有
    /Build.sh
    )。库将针对不同的目标构建(
    arm64-v8a
    armeabi
    x86_64
    等)
  • 此时,库头位于
    ${YOUR_LIBS_FOLDER}/libpng android/jni
    libpng.a
    位于
    ${YOUR_LIBS_FOLDER}/libpng android/obj/local/${android_ABI}/
    ,其中
    ${android_ABI}
    是目标平台
  • 最后,您可以在
    CMakeLists.txt
    中包含lib
    libpng
    需要,所以您也需要针对它进行链接(
    zlib
    由android studio提供,所以只需添加
    -lz
    标志)
  • 这是我的
    CMakeLists.txt
    中的相关文章:

    add_library(libpng STATIC IMPORTED)
    set_target_properties(libpng PROPERTIES IMPORTED_LOCATION
        ${YOUR_LIBS_FOLDER}/libpng-android/obj/local/${ANDROID_ABI}/libpng.a)
    
    add_library(appManager SHARED src/main/cpp/appManager.cpp)
    
    target_include_directories(appManager PRIVATE ${YOUR_LIBS_FOLDER}/libpng-android/jni/)
    
    target_link_libraries(appManager
                           android
                           libpng
                           z)
    
    有几件事需要注意:

    • ${ANDROID_ABI}
      是由ANDROID Studio构建系统设置的变量
    • 再一次:您需要针对链接,这就是为什么我们在
      target\u link\u库中使用
      libpng z
      而不是
      libpng

      • 使用Android Studio 3.6,将libpng包含到项目中相当容易

        • 从下载最新的源代码并解压缩zip文件
        • 在Android Studio中,确保安装了NDKCMake(在SDK管理器中)
        • 创建一个新的Android库模块,称之为pngAndroid(我建议 将包名设置为
          org.libpng.libpng
          ,与MacOS相同)。保留Java,并选择适合您的应用程序的min SDK
        • 对于这个模块,选择<强>文件/Link C++项目,使用Gradle 。查找作为步骤1下载的libpngCMakleLists.txt
        • 在pngAndroid的build.gradle中添加

          android.defaultConfig.externalNativeBuild.cmake.targets "png_static"
          
        • 项目结构对话框中,指定模块和pngAndroid之间的模块依赖关系

        构建pngAndroid模块时,您将在pngAndroid下的build/intermediates/cmake/debug/obj目录中看到文件libpng16d.a

        在您的模块中,还有CMakleLists.txt。在这个脚本中,您有一个目标,例如

        您应该添加libpng作为本机库的依赖项:

        target_link_libraries(native-library libpng)
        
        add_library(libpng STATIC IMPORTED)
        set_target_properties(libpng PROPERTIES IMPORTED_LOCATION
            ../pngAndroid/build/intermediates/cmake/debug/obj/${ANDROID_ABI}/libpng16d.a)
        set_target_properties(libpng PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
            ../../lpng1637)
        set_target_properties(libpng PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES
            z)
        
        apply plugin: 'com.android.library'
        
        android {
            compileSdkVersion 29
            defaultConfig {
                minSdkVersion 16
                targetSdkVersion 29
                versionCode 1
                versionName "1.0"
                externalNativeBuild {
                    cmake {
                        arguments "-DSKIP_INSTALL_ALL=YES"
                        targets "png"
                    }
                }
            }
        
            externalNativeBuild {
                cmake {
                    path file('../../lpng1637/CMakeLists.txt')
                }
            }
        }
        
        在本CMakleLists.txt的其他地方,您应该定义导入的libpng

        target_link_libraries(native-library libpng)
        
        add_library(libpng STATIC IMPORTED)
        set_target_properties(libpng PROPERTIES IMPORTED_LOCATION
            ../pngAndroid/build/intermediates/cmake/debug/obj/${ANDROID_ABI}/libpng16d.a)
        set_target_properties(libpng PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
            ../../lpng1637)
        set_target_properties(libpng PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES
            z)
        
        apply plugin: 'com.android.library'
        
        android {
            compileSdkVersion 29
            defaultConfig {
                minSdkVersion 16
                targetSdkVersion 29
                versionCode 1
                versionName "1.0"
                externalNativeBuild {
                    cmake {
                        arguments "-DSKIP_INSTALL_ALL=YES"
                        targets "png"
                    }
                }
            }
        
            externalNativeBuild {
                cmake {
                    path file('../../lpng1637/CMakeLists.txt')
                }
            }
        }
        
        请注意,这里我使用了a)到您添加到Android Studio项目的pngAndroid模块的相对路径,以及b)到您下载的libpng源的相对路径。在您的设置中,相对路径可能不同


        为了完整起见,这里有一个清理过的
        build.gradle
        脚本,用于pngAndroid构建共享库libpng16d。因此

        target_link_libraries(native-library libpng)
        
        add_library(libpng STATIC IMPORTED)
        set_target_properties(libpng PROPERTIES IMPORTED_LOCATION
            ../pngAndroid/build/intermediates/cmake/debug/obj/${ANDROID_ABI}/libpng16d.a)
        set_target_properties(libpng PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
            ../../lpng1637)
        set_target_properties(libpng PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES
            z)
        
        apply plugin: 'com.android.library'
        
        android {
            compileSdkVersion 29
            defaultConfig {
                minSdkVersion 16
                targetSdkVersion 29
                versionCode 1
                versionName "1.0"
                externalNativeBuild {
                    cmake {
                        arguments "-DSKIP_INSTALL_ALL=YES"
                        targets "png"
                    }
                }
            }
        
            externalNativeBuild {
                cmake {
                    path file('../../lpng1637/CMakeLists.txt')
                }
            }
        }
        
        构建模块时,您将进入构建/输出一个aar文件,该文件包含jni目录和
        armeabi-v7a/libpng16d.so
        以及所有其他ABI变体



        最后,值得一提的是谷歌。不幸的是,它还没有发布。

        我在windows上,无法使用build.sh,而且这种重新打包是不可靠的(即bug#130,他们只是禁用了arm,而没有实际修复它)我还可以在我的项目中包含十几个文件,并完全避免链接。@Olivetree在
        build.sh
        中有一个命令:
        ndk build ndk\u project\u PATH=./$@
        ,可以在没有.sh的情况下手动执行。考虑到“bug 130”-同意,看起来很奇怪。没错,但最后一点仍然存在:我还可以手动将文件添加到我的项目中,避免管理这个构建及其工具链设置的负担。但我并不真正相信这种方法:你看过正式的libpng构建过程吗?这有点太复杂了,不能指望没有问题就这样做。你能帮我澄清一下吗,你提供的方法是我们创建一个模块,并(比如)将
        libpng
        包含到这个模块中。结果是-我们有一个带有
        libpng