我正试图在Windows10上使用Android和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.我递归地对我的项目、.android、.AndroidStudio2.2目录以及文件名进行了grep,除了genout.cmake之外,在armv5te中没有发现任何东西。我的abiFilters线路是abiFilters 'x86'。
如何构建libpng链接到我的本地应用程序?另外,在Android中,它显示了该项目现在包括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)发布于 2017-02-25 13:21:47
我管理libpng使用Android.mk应用程序(CMake构建系统而不是Android.mk)作为静态库。我用的是libpng-android重新打包。以下是我所做的事情:
git clone https://github.com/julienr/libpng-android.git ${YOUR_LIBS_FOLDER} (我使用了${ANDROID_NDK_ROOT_DIRECTORY}/sources/android)。${ANDROID_NDK_ROOT_DIRECTORY} (home/username/Android/sdk/ndk-bundle for me)添加到构建脚本所需的全局$PATH变量中。ndk-build构建库(在使用lib的目录中有./build.sh )。将为不同的ABI目标( arm64-v8a、armeabi、x86_64等)建立库。${YOUR_LIBS_FOLDER}/libpng-android/jni上有库头,在${YOUR_LIBS_FOLDER}/libpng-android/obj/local/${ANDROID_ABI}/上有libpng.a,而${ANDROID_ABI}是目标平台。CMakeLists.txt上包含lib。libpng需要zlib压缩库,所以您也需要针对它进行链接(zlib由android提供,所以只需添加-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}是设置的一个变量。target_link_libraries中使用libpng z而不是libpng。发布于 2019-10-27 20:08:45
在AndroidStudio3.6中,将libpng包含到您的项目中是相当容易的。
org.libpng.libpng,与MacOS相同)。保持Java,并选择适合您的应用程序的min。build.gradle中,添加
android.defaultConfig.externalNativeBuild.cmake.targets "png_static“当您构建pngAndroid模块时,您将在pngAndroid下的目录中看到libpng16d.a。
在您的模块中,也有CMakleLists.txt.在这个脚本中,你有一个目标。
add_library(native-library SHARED …您应该将native-library的依赖项添加libpng。
target_link_libraries(native-library libpng)在这个CMakleLists.txt的其他地方,您应该定义导入的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)注意,这里我使用了相对路径( a)到您添加到Android项目中的pngAndroid模块,以及( b)您下载的libpng源代码。在您的设置中,相对路径可能有所不同。
为了完整起见,下面是一个经过清理的build.gradle脚本,用于构建共享库libpng16d.so的pngAndroid。
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 正在开发一个更简单的本机包管理器。。不幸的是,它还没有发布。
https://stackoverflow.com/questions/42260434
复制相似问题