首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows中的Building+linking libpng与CMake

Windows中的Building+linking libpng与CMake
EN

Stack Overflow用户
提问于 2017-02-15 21:30:07
回答 2查看 5.1K关注 0票数 5

我正试图在Windows10上使用Android和CMake启动一个本地应用程序项目,但我仍然坚持要包含libpng。

首先,这是我第一次看到CMakeLists.txt文件。我花了一天时间才发现target_link_libraries(native-activity ... png)不可能是target_link_libraries(png native-activity ...),因为所有的错误消息都是关于没有创建的文件和由于缺少工具链的需求而导致命令失败的命令(为什么列表末尾有重要的错误?不酷!)。

最后,在项目中包含libpng之后,我现在得到了一个构建错误:

代码语言:javascript
复制
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目录以及文件名进行了grep,除了genout.cmake之外,在armv5te中没有发现任何东西。我的abiFilters线路是abiFilters 'x86'

如何构建libpng链接到我的本地应用程序?另外,在Android中,它显示了该项目现在包括libpng源文件(至少有9个项目专用于它!)有什么办法把它移走吗?

这是我的CMakeLists.txt:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-25 13:21:47

我管理libpng使用Android.mk应用程序(CMake构建系统而不是Android.mk)作为静态库。我用的是libpng-android重新打包。以下是我所做的事情:

  1. git clone https://github.com/julienr/libpng-android.git ${YOUR_LIBS_FOLDER} (我使用了${ANDROID_NDK_ROOT_DIRECTORY}/sources/android)。
  2. ${ANDROID_NDK_ROOT_DIRECTORY} (home/username/Android/sdk/ndk-bundle for me)添加到构建脚本所需的全局$PATH变量中。
  3. ndk-build构建库(在使用lib的目录中有./build.sh )。将为不同的ABI目标( arm64-v8aarmeabix86_64等)建立库。
  4. 此时,您在${YOUR_LIBS_FOLDER}/libpng-android/jni上有库头,在${YOUR_LIBS_FOLDER}/libpng-android/obj/local/${ANDROID_ABI}/上有libpng.a,而${ANDROID_ABI}是目标平台。
  5. 最后,您可以在CMakeLists.txt上包含lib。libpng需要zlib压缩库,所以您也需要针对它进行链接(zlib由android提供,所以只需添加-lz标志)。

这是我的CMakeLists.txt的相关文章

代码语言:javascript
复制
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}是设置的一个变量。
  • 再说一次:您需要链接到zlib,这就是为什么我们在target_link_libraries中使用libpng z而不是libpng
票数 9
EN

Stack Overflow用户

发布于 2019-10-27 20:08:45

在AndroidStudio3.6中,将libpng包含到您的项目中是相当容易的。

  • sourceforge下载最新的源代码并解压缩zip文件。
  • 在Android中,确保安装了NDKCMake (在SDK管理器中)
  • 创建一个新的Android模块,称为pngAndroid (我建议将包名设置为org.libpng.libpng,与MacOS相同)。保持Java,并选择适合您的应用程序的min。
  • 对于这个模块,选择File/Link C++ Project 。找到作为步骤1下载的CMakleLists.txt of libpng
  • pngAndroid's build.gradle中,添加 android.defaultConfig.externalNativeBuild.cmake.targets "png_static“
  • 项目结构对话框中,指定模块与pngAndroid之间的模块依赖关系。

当您构建pngAndroid模块时,您将在pngAndroid下的目录中看到libpng16d.a。

在您的模块中,也有CMakleLists.txt.在这个脚本中,你有一个目标。

代码语言:javascript
复制
add_library(native-library SHARED …

您应该将native-library的依赖项添加libpng。

代码语言:javascript
复制
target_link_libraries(native-library libpng)

在这个CMakleLists.txt的其他地方,您应该定义导入的libpng。

代码语言:javascript
复制
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)

注意,这里我使用了相对路径( a)到您添加到Android项目中的pngAndroid模块,以及( b)您下载的libpng源代码。在您的设置中,相对路径可能有所不同。

为了完整起见,下面是一个经过清理的build.gradle脚本,用于构建共享库libpng16d.so的pngAndroid。

代码语言:javascript
复制
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')
        }
    }
}

在构建模块时,您将在build/outputs中获得一个包含armeabi-v7a/libpng16d.so和所有其他ABI变体的jni目录的aar文件。

最后,值得一提的是Google 正在开发一个更简单的本机包管理器。。不幸的是,它还没有发布。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42260434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档