抚州企业网站做优化,制作个人网站实例,wordpress搭建500错误,赣州人才网官网入口前言
接Android Studio引入ndk编译的so库的故事#xff0c;这个东西搞了两周以后#xff0c;由于自己不熟悉Java和安卓开发#xff0c;踩了不少坑#xff0c;其中一周时间都是花在怎么用Android Studio上的。。。AS下的新版本Koala#xff0c;结果网上资料全是旧版本这个东西搞了两周以后由于自己不熟悉Java和安卓开发踩了不少坑其中一周时间都是花在怎么用Android Studio上的。。。AS下的新版本Koala结果网上资料全是旧版本很多设置完全不同遇了问题经常不知所措后面不得已换成了老一点的2021 dolphin版本也学会了看安卓官网资料逐渐才稳定下来。
好在不是紧急项目后面赶主要任务进度就改成每周抽一天时间去处理这个任务最核心的在于如何将cairo库移植到安卓环境去使用这是一个2D绘图库awtk的画布后端也有cairo的选择几周摸爬滚打终于将cairo移植到了安卓上特此记录下算是个人进军安卓开发的一小步。
环境
OSWindows11
Cairo: 1.18.0
Android Studio: Dolphin 2021.3.1.17
NDK: r26
确保上述环境和工具已经下好NDK用windows或者linux的都行不过经个人测试linux相比windows巨慢linux下编译系统的log输出一条时间都够windows下输出十几条了我没用虚拟机桌面系统用的WSL兴许是WSL本身的性能问题
Stage1 下载CairoMeson编译
cairo下载地址https://www.cairographics.org/download/
从1.17.8开始cairo不再使用传统的configuremakefile构建系统了而是改用一个新的构建系统meson它的编译语法很像python但并不像awtk的scons那样是完全基于python, 算是类python语言。
不得不接触新的编译系统多少有些抵触不过手册和案例看下来逐渐感觉这个系统香了因为cairo库有很多依赖比如pixman, glib, freetype等meson项目上有wrap脚本在编译的时候发现依赖缺失可以直接从网上下下来特定版本。
要是旧版本的话不只要自己一个个下依赖去配置还要考虑依赖树内各个节点的版本兼容的问题苦不堪言这个自动下载的功能实在厉害
对于交叉编译meson可以通过编写txt文件指定特定平台的编译我这里目标是armv7平台给arm的平板使用。
其实还想试试x86平台的因为AS上arm架构机型没法模拟无法启动查了下是电脑架构x86不好模拟arm的原因 之前自己试过编译结果遇到的坑根本无法解决然后看了点科普才知道手机x86架构算是古早的被市场淘汰的产品除了模拟器现在手机平板都是arm架构看来是没有市场价值那估计官方也没有考虑这平台释怀了。。。。只能找arm架构的实机了好在公司提供了个IDO-EVB3562开发板用来装安卓映像。
不废话交叉编译设置cross_file_build_win_host_arm.txt如下
[constants]
android_ndkD:\Devtools\android-ndk-r26d-win\toolchains\llvm\prebuilt\windows-x86_64\
android_ndk_toolchainD:\Devtools\android-ndk-r26d-win\toolchains\llvm\prebuilt\windows-x86_64\bin[binaries]
c android_ndk_toolchain / armv7a-linux-androideabi33-clang.cmd
cpp android_ndk_toolchain / armv7a-linux-androideabi33-clang.cmd
ar android_ndk_toolchain / llvm-ar.exe
ld android_ndk_toolchain / ld.exe
strip android_ndk_toolchain / llvm-strip.exe[properties]
sys_root android_ndk / sysroot
c_link_args [-fuse-ldgold]
cpp_link_args [-fuse-ldgold][host_machine]
system android
cpu_family arm
cpu armv7a
endian little
如果linux平台上则是
[constants]
android_ndk/mnt/d/Devtools/android-ndk-r26d-linux/toolchains/llvm/prebuilt/linux-x86_64/
android_ndk_toolchain/mnt/d/Devtools/android-ndk-r26d-linux/toolchains/llvm/prebuilt/linux-x86_64/bin[binaries]
c android_ndk_toolchain / armv7a-linux-androideabi33-clang
cpp android_ndk_toolchain / armv7a-linux-androideabi33-clang
ar android_ndk_toolchain / llvm-ar
ld android_ndk_toolchain / ld
strip android_ndk_toolchain / llvm-strip[properties]
sys_root android_ndk / sysroot
c_link_args [-fuse-ldgold]
cpp_link_args [-fuse-ldgold][host_machine]
system android
cpu_family arm
cpu armv7a
endian little
注意windows版我指定了后缀名因为meson实际上是脚本根据路径的文件名执行对应文件给脚本提供的实际是文件路径。
以下指令启动meson的编译--cross-file用于指定交叉编译文件
meson setup --cross-file cross_file_build_win_host_arm.txt build_win_host_arm等待一段时间让meson把一切配置好最后meson会弹出项目的各项配置总结
cairo 1.18.0Surface BackendsImage : YESRecording : YESObserver : YESMime : YESTee : YESXlib : NOXlib Xrender : NOQuartz : NOQuartz-image : NOXCB : NOWin32 : NOCairoScript : YESPostScript : YESPDF : YESSVG : YESFont BackendsUser : YESFreeType : YESFontconfig : YESWin32 : NOWin32 DWrite : NOQuartz : NOFunctionsPNG functions : YESX11-xcb : NOXCB-shm : NOFeatures and Utilitiescairo-trace: : NOcairo-script-interpreter: YESAPI reference : NOSubprojectsfontconfig : YESfreetype2 : YES (from fontconfig)glib : NO Dependency iconv not found, tried builtin and systemgperf : YES (from fontconfig)libintl : NO Include dir /usr/local/include does not exist.libpng : YESlibxml2 : YES (from fontconfig)pixman : YESUser defined optionsCross files : cross_file_build_win_host_arm.txt
Found ninja-1.12.1 at D:\Devtools\Meson\ninja.EXE接下来就加入meson的第二阶段ninja编译
ninja -C build_win_host_arm到了这一步开始编译就开始不风顺了中间一定会遇到某些问题比如头文件缺失或者源码的哪些不规范用法在gcc上过得去到了ndk的clang就撞error或者丢了哪些库不过只要不是系统性问题基本都能解决。我这里先不讲问题放在最后的踩坑上记录。
Stage2 Cairo安卓项目
ninja编译完成后应该会有以下so库这些库都要放到后面安卓项目的libs文件夹上缺一不可。
除了libcpufeatures.so是在ndk内部其他库应该都能在build_win_host_arm内找到。
libcairo.so
libcpufeatures.so
libfontconfig.so
libfreetype.so
libglib-2.0.so
libintl.so
libpcre2-8.so
libpixman-1.so
libpng16.so
libxml2.soAndroid Studio新建NativeC项目, 后面就是各种配置了, 然而自己不懂安卓开发在编码实现上还是一头雾水结果网上一查其实已经有人把cairo的移植做出来了把源码适配了下居然能用。Nice, 那不担心了。
省篇幅我就直接发源码吧https://gitee.com/tracker647/cairo-for-android
记录一些注意点
1.CMake版本务必换成更新的3.22.1否则不识别编译选项一些库明明加了硬说没有。
2.adbFilter选项由于这里用的armv7a,则只指定armv7a就行了。
根据1 2修改后的build.gradle的android部分例
android {namespace com.example.cairotestcompileSdk 32defaultConfig {applicationId com.example.cairotestminSdk 24targetSdk 32versionCode 1versionName 1.0testInstrumentationRunner androidx.test.runner.AndroidJUnitRunnerndk {abiFilters armeabi-v7a}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}externalNativeBuild {cmake {path file(src/main/cpp/CMakeLists.txt)version 3.22.1}}buildFeatures {viewBinding true}
}3.cairo官方提供了一些编码案例我用的其中一个画星星的例子画的时候注意看有没有cairo_scale这个函数这是用来控制整个坐标系放缩的比如设置了cario_scale(width, height), 后面各种api传坐标就不用加width和height了直接传百分比就行用的移植例子一开始没注意画出来结果一脸懵逼。
最终效果图桌面是cairo在ubuntu wsl平台的运行结果平板(IDO-EVB3562开发板连了个电容屏)是安卓平台运行结果。 ninja踩坑
tips:-v打开指令log
ninja -C $builddir -v**…\subprojects\fontconfig\src/fcint.h:32:10: fatal error: ‘fcstdint.h’ file not found**
一个简单的封装stdint.h的头文件缺失补全即可我是拿的其他平台的build文件夹去补的就奇怪我在其他平台上这个文件生成的好好的为什么到了这里就没了
**…/subprojects/pixman/pixman/pixman-arm.c:99:10: fatal error: ‘cpu-features.h’ file not found**
这个文件依赖于ndk的cpufeatures库正好ndk的cpufeatures文件夹提供了mk文件直接编译即可不过生成的是静态库我这里图后期用的库格式一致改成动态库了。
cd到这个文件夹然后ndk-build:
PS D:\Devtools\android-ndk-r26d-win\sources\android\cpufeatures ndk-build NDK_PROJECT_PATH. APP_BUILD_SCRIPT./Android.mk接着就会生成libs和objs文件夹libs和objs文件夹下有目标库现在切回到cairo项目build_linux_host_arm文件夹下有个build.ninja是ninja执行时用的脚本CV报错指令找到对应command, 把cpu_features头文件加入
build subprojects/pixman/pixman/libpixman-1.so.p/pixman-arm.c.o: c_COMPILER …/subprojects/pixman/pixman/pixman-arm.c DEPFILE “subprojects\pixman\pixman\libpixman-1.so.p\pixman-arm.c.o.d” DEPFILE_UNQUOTED subprojects\pixman\pixman\libpixman-1.so.p\pixman-arm.c.o.d ARGS “-Isubprojects\pixman\pixman\libpixman-1.so.p” “-Isubprojects\pixman\pixman” “-I…\subprojects\pixman\pixman” “-ID:\Devtools\android-ndk-r26d-win\sources\android\cpufeatures” “-fdiagnostics-coloralways” “-D_FILE_OFFSET_BITS64” “-Wall” “-Winvalid-pch” “-Wextra” “-stdgnu99” “-O0” “-g” “-Wdeclaration-after-statement” “-fno-strict-aliasing” “-fvisibilityhidden” “-Wundef” “-ftrapping-math” “-Wno-unused-local-typedefs” “-DHAVE_CONFIG_H” “-fPIC” “-pthread”
头文件的错误就过去了接下来链接指令由于未加入cpufeatures库必定报错
**…/subprojects/pixman/pixman/pixman-arm.c:108: error: undefined reference to ‘android_getCpuFamily’** …/subprojects/pixman/pixman/pixman-arm.c:109: error: undefined reference to ‘android_getCpuFeatures’
build.ninja找到对应链接指令,指定库路径, libs和objs都可以注意架构这个例子是armv7a
build subprojects/pixman/pixman/libpixman-1.so: c_LINKER_RSP subprojects/pixman/pixman/libpixman-1.so.p/pixman.c.o subprojects/pixman/pixman/libpixman-1.so.p/pixman-access.c.o
。。。
subprojects/pixman/pixman/libpixman-arm-neon.a subprojects/pixman/pixman/libpixman-arm-simd.a
LINK_ARGS “D:\Devtools\android-ndk-r26d-win\sources\android\cpufeatures\libs\armeabi-v7a\cpufeatures.so” “-Wl,–as-needed” “-Wl,–no-undefined” “-shared” “-fPIC” “-Wl,-soname,libpixman-1.so” “-fuse-ldgold” “-Wl,–start-group” “subprojects/pixman/pixman/libpixman-arm-simd.a” “subprojects/pixman/pixman/libpixman-arm-neon.a” “-lm” “-Wl,–end-group” “-pthread”
**— stderr —** Traceback (most recent call last): File “D:\MyCodeBase\KChartSimulate\cairo-1.18.0\build_win_host_arm\subprojects\glib-2.74.0\gobject\glib-mkenums”, line 486, in write_output(prod) File “D:\MyCodeBase\KChartSimulate\cairo-1.18.0\build_win_host_arm\subprojects\glib-2.74.0\gobject\glib-mkenums”, line 97, in write_output print(output, fileoutput_stream) UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa9’ in position 17: illegal multibyte sequence
windows系统下特供错误版权符号©没有gbk编码而windows终端就是gdb编码输出中文的这个卡住过一段时间试过输入chcp 65001也没用网上没合理答案找glib的gitlab提issue也没人理最后还是问ai找到了解决方法把这个符号直接替换掉
def write_output(output):global output_streamoutput output.replace(\xa9, )print(output, fileoutput_stream)**…/subprojects/glib-2.74.0/gio/gsocket.c:497:37: error: passing ‘guint *’ (aka ‘unsigned int *’) to parameter of type socklen_t ’ (aka int ) converts between pointers to integer types with different sign [-Werror,-Wpointer-sign] 修改build.ninja把-Wpointer-sign去除掉, 或者直接修改源码加入强转不过十几条error,不值得。
build subprojects/glib-2.74.0/gio/libgio-2.0.so.p/gsocket.c.o: c_COMPILER …/subprojects/glib-2.74.0/gio/gsocket.c || subprojects/glib-2.74.0/gio/gdbus-daemon-generated.h subprojects/glib-2.74.0/gio/gioenumtypes.h subprojects/glib-2.74.0/gio/xdp-dbus.h subprojects/glib-2.74.0/gobject/glib-enumtypes.h DEPFILE “subprojects\glib-2.74.0\gio\libgio-2.0.so.p\gsocket.c.o.d” DEPFILE_UNQUOTED subprojects\glib-2.74.0\gio\libgio-2.0.so.p\gsocket.c.o.d ARGS “-Isubprojects\glib-2.74.0\gio\libgio-2.0.so.p” “-Isubprojects\glib-2.74.0\gio” “-I…\subprojects\glib-2.74.0\gio” “-Isubprojects\glib-2.74.0” “-I…\subprojects\glib-2.74.0” “-Isubprojects\glib-2.74.0\glib” “-I…\subprojects\glib-2.74.0\glib” “-Isubprojects\proxy-libintl” “-I…\subprojects\proxy-libintl” “-Isubprojects\glib-2.74.0\gobject” “-I…\subprojects\glib-2.74.0\gobject” “-Isubprojects\glib-2.74.0\gmodule” “-I…\subprojects\glib-2.74.0\gmodule” “-Isubprojects\glib-2.74.0\subprojects\gvdb” “-I…\subprojects\glib-2.74.0\subprojects\gvdb” “-fdiagnostics-coloralways” “-D_FILE_OFFSET_BITS64” “-Wall” “-Winvalid-pch” “-Wextra” “-Wpedantic” “-stdgnu99” “-O0” “-g” “-D_GNU_SOURCE” “-fno-strict-aliasing” “-DG_ENABLE_DEBUG” “-Wimplicit-fallthrough” “-Wmisleading-indentation” “-Wunused” “-Wno-unused-parameter” “-Wno-cast-function-type” “-Wno-pedantic” “-Wno-format-zero-length” “-Wno-variadic-macros” “-Werrorformat2” “-Werrorinit-self” “-Werrormissing-include-dirs” “-Werrorpointer-arith” “-Werrorunused-result” “-Wstrict-prototypes” “-Wno-bad-function-cast” “-Werrordeclaration-after-statement” “-Werrorimplicit-function-declaration” “-Werrormissing-prototypes” “-Werrorpointer-sign” “-fPIC” “-DG_LOG_DOMAIN“GLib-GIO”” “-DGIO_COMPILATION” “-DGIO_LAUNCH_DESKTOP“c:/libexec/gio-launch-desktop”” “-DGIO_MODULE_DIR“c:/lib/gio/modules”” “-DLOCALSTATEDIR“c:/var”” “-fvisibilityhidden” 文章转载自: http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.gqddl.cn.gov.cn.gqddl.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.nkjxn.cn.gov.cn.nkjxn.cn http://www.morning.dlurfdo.cn.gov.cn.dlurfdo.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.paoers.com.gov.cn.paoers.com http://www.morning.yzmzp.cn.gov.cn.yzmzp.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.sglcg.cn.gov.cn.sglcg.cn http://www.morning.xnflx.cn.gov.cn.xnflx.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.ztrht.cn.gov.cn.ztrht.cn http://www.morning.srzhm.cn.gov.cn.srzhm.cn http://www.morning.kkwbw.cn.gov.cn.kkwbw.cn http://www.morning.wjplr.cn.gov.cn.wjplr.cn http://www.morning.smjyk.cn.gov.cn.smjyk.cn http://www.morning.rsxw.cn.gov.cn.rsxw.cn http://www.morning.xdqrz.cn.gov.cn.xdqrz.cn http://www.morning.yjdql.cn.gov.cn.yjdql.cn http://www.morning.qsbcg.cn.gov.cn.qsbcg.cn http://www.morning.pzbqm.cn.gov.cn.pzbqm.cn http://www.morning.ntlxg.cn.gov.cn.ntlxg.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.jqkjr.cn.gov.cn.jqkjr.cn http://www.morning.trqzk.cn.gov.cn.trqzk.cn http://www.morning.qqhersx.com.gov.cn.qqhersx.com http://www.morning.hdnd.cn.gov.cn.hdnd.cn http://www.morning.nxfuke.com.gov.cn.nxfuke.com http://www.morning.rnqnp.cn.gov.cn.rnqnp.cn http://www.morning.pxsn.cn.gov.cn.pxsn.cn http://www.morning.yrflh.cn.gov.cn.yrflh.cn http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn http://www.morning.nynlf.cn.gov.cn.nynlf.cn http://www.morning.nwllb.cn.gov.cn.nwllb.cn http://www.morning.poapal.com.gov.cn.poapal.com http://www.morning.bnpn.cn.gov.cn.bnpn.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.mgtmm.cn.gov.cn.mgtmm.cn http://www.morning.nftzn.cn.gov.cn.nftzn.cn http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn http://www.morning.fy974.cn.gov.cn.fy974.cn http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.hdtcj.cn.gov.cn.hdtcj.cn http://www.morning.bzlsf.cn.gov.cn.bzlsf.cn http://www.morning.zxhpx.cn.gov.cn.zxhpx.cn http://www.morning.zrlms.cn.gov.cn.zrlms.cn http://www.morning.joinyun.com.gov.cn.joinyun.com http://www.morning.rzdzb.cn.gov.cn.rzdzb.cn http://www.morning.mjmtm.cn.gov.cn.mjmtm.cn http://www.morning.tklqs.cn.gov.cn.tklqs.cn http://www.morning.gtmgl.cn.gov.cn.gtmgl.cn http://www.morning.mstrb.cn.gov.cn.mstrb.cn http://www.morning.trfh.cn.gov.cn.trfh.cn http://www.morning.splcc.cn.gov.cn.splcc.cn http://www.morning.xdpjf.cn.gov.cn.xdpjf.cn http://www.morning.cwzzr.cn.gov.cn.cwzzr.cn http://www.morning.gbybx.cn.gov.cn.gbybx.cn http://www.morning.hrgxk.cn.gov.cn.hrgxk.cn http://www.morning.wgzgr.cn.gov.cn.wgzgr.cn http://www.morning.krjyq.cn.gov.cn.krjyq.cn http://www.morning.thpzn.cn.gov.cn.thpzn.cn http://www.morning.gzgwn.cn.gov.cn.gzgwn.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.gzzncl.cn.gov.cn.gzzncl.cn http://www.morning.wxfjx.cn.gov.cn.wxfjx.cn http://www.morning.jwbfj.cn.gov.cn.jwbfj.cn http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn http://www.morning.fpbj.cn.gov.cn.fpbj.cn http://www.morning.qrpdk.cn.gov.cn.qrpdk.cn http://www.morning.byshd.cn.gov.cn.byshd.cn http://www.morning.xlpdm.cn.gov.cn.xlpdm.cn http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn http://www.morning.dmcxh.cn.gov.cn.dmcxh.cn http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn http://www.morning.zqmdn.cn.gov.cn.zqmdn.cn