建立+链接Android Studio中的libpng和Windows上的CMake

Oli*_*ree 4 android cmake android-studio

我正在尝试在Windows 10上使用Android Studio和CMake启动本机应用程序项目,但我仍然坚持使用libpng.

对于初学者来说,这是我第一次看到CMakeLists.txt文件.我花了一天找出target_link_libraries(native-activity ... png)不能target_link_libraries(png native-activity ...)因为所有的错误信息大约未能由于从工具链遗漏的需求未被创建的文件和命令(为什么是在列表的末尾基本错误?不冷静!).

在最终设法在项目中包含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.
Run Code Online (Sandbox Code Playgroud)

我递归地grep了我的项目,.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)
Run Code Online (Sandbox Code Playgroud)

Ram*_*hev 6

我已经管理libpng使用android NDK应用程序(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对我来说)添加到$PATH构建脚本所需的全局变量中.
  3. 用lib构建lib ndk-build(./build.sh在lib目录中有).图书馆将针对不同的建成ABI目标(arm64-v8a,armeabi,x86_64等).
  4. 在这一点上,你必须在库头${YOUR_LIBS_FOLDER}/libpng-android/jni,并libpng.a${YOUR_LIBS_FOLDER}/libpng-android/obj/local/${ANDROID_ABI}/其中${ANDROID_ABI}为目标平台.
  5. 最后你可以包括lib at CMakeLists.txt.libpng需要zlib压缩库,所以你需要链接它(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)
Run Code Online (Sandbox Code Playgroud)

那里有几点需要注意:

  • ${ANDROID_ABI} 是由Android Studio构建系统设置的变量.
  • 再次:你需要对链接zlib的,这就是为什么我们libpng z的,而不是libpngtarget_link_libraries.

  • 确实如此,但最后一点仍然存在:我不妨手动将文件添加到我的项目中,并避免管理此构建及其工具链设置的负担。但我不太相信这种方法:你看过官方的 libpng 构建过程吗?想要毫无问题地做到这一点有点太复杂了。 (2认同)

Ale*_*ohn 5

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

\n\n
    \n
  • 从sourceforge下载最新的源代码并解压 zip 文件。
  • \n
  • 在 Android Studio 中,确保安装了NDKCMake(在SDK Manager中)
  • \n
  • 创建一个新的Android 库模块,将其命名为pngAndroid(我建议\n将包名称设置为org.libpng.libpng,与 MacOS 相同)。保持 Java,并选择适合您的应用程序的最小 SDK。
  • \n
  • 对于此模块,选择File/Link C++ Project with Gradle。找到您在步骤 1 中下载的libpngCMakleLists.txt 。
  • \n
  • pngAndroid的中build.gradle,添加

    \n\n
    android.defaultConfig.externalNativeBuild.cmake.targets "png_static"\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • “项目结构”对话框中,指定 Module 和pngAndroid之间的模块依赖关系。

  • \n
\n\n

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

\n\n

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

\n\n
add_library(native-library SHARED \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

您应该添加libpng作为native-library的依赖项:

\n\n
target_link_libraries(native-library libpng)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此CMakleLists.txt 的其他位置,您应该定义导入的libpng

\n\n
add_library(libpng STATIC IMPORTED)\nset_target_properties(libpng PROPERTIES IMPORTED_LOCATION\n    ../pngAndroid/build/intermediates/cmake/debug/obj/${ANDROID_ABI}/libpng16d.a)\nset_target_properties(libpng PROPERTIES INTERFACE_INCLUDE_DIRECTORIES\n    ../../lpng1637)\nset_target_properties(libpng PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES\n    z)\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,此处我使用了a)到您添加到 Android Studio 项目的pngAndroid模块的相对路径,以及b)到您下载的libpng源的相对路径。在您的设置中,相对路径可能不同。

\n\n
\n\n

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

\n\n
apply plugin: \'com.android.library\'\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        minSdkVersion 16\n        targetSdkVersion 29\n        versionCode 1\n        versionName "1.0"\n        externalNativeBuild {\n            cmake {\n                arguments "-DSKIP_INSTALL_ALL=YES"\n                targets "png"\n            }\n        }\n    }\n\n    externalNativeBuild {\n        cmake {\n            path file(\'../../lpng1637/CMakeLists.txt\')\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

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

\n