首页 > 编程知识 正文

西门子et200 s 模块接线讲解,android auto 添加应用

时间:2023-05-05 10:42:57 阅读:269563 作者:885

最近开始做Android平台下的CarPlay开发, 笔者暂时负责Bonjour 及 apple 提供的插件(开发包)移植到Android平台的工作, 移植过程中遇到了很多问题, 现记录一下遇到的主要问题,希望能帮助到遇到同样问题的同学。 一. Bonjour 及 CarPlay Plugin移植到 Linux 并运行

因为CarPlay Plugin 需要Bonjour的支持, 因此需要先编译好Bonjour, Bonjour和CarPlay Plugin都提供了Posix兼容平台的makefile, 因此先把他们移植到Linux环境,运行、证代码是否正常,然后再移植到Android NDK 环境。

Bonjour是开源项目,代码目录名为:mDNSResponder, 有很多个版本, CarPlay Plugin 依赖特定版本的Bonjour, 但是在文档及代码注释中都没有找到相关的说明, 后来直接搜索代码,找到mDNSResponder-320版本能满足需求,因此在网上下载了这个版本的代码, 放到Ubuntu环境中编译,

(此处堪一误,CarPlay plugin中的readme中明确指出需要544版本的bonjour)笔者之前用107版本的代码会提示:

kDNSServiceFlagsSuppressUnusable找不到。

问题1:

cd 到 mDNSPosix目录下面, 执行make os=linux, 会得到以下错误: dns-sd.c: In function ‘getip’:

dns-sd.c:173:30: error: ‘struct sockaddr’ has no member named ‘sa_len’

#define SA_LEN(addr) ((addr)->sa_len)

原因是Ubuntu环境下网络地址中没有sa_len这个成员,所以把这里出错代码:

memcpy(result, addrs->ai_addr, SA_LEN(addrs->ai_addr));

改成

memcpy(result, addrs->ai_addr, sizeof(addrs->ai_addr));

即可。     问题2:    dnsextd_parser.y.o  dnsextd_lexer.l.o 文件找不到

查看makefile 看到.y .l文件的编译规则为:

$(OBJDIR)/%.y.o: $(SHAREDDIR)/%.y

$(BISON) -o $(OBJDIR)/$*.c -d $<

$(CC) $(CFLAGS) -c -o $@ $(OBJDIR)/$*.c

$(OBJDIR)/%.l.o: $(SHAREDDIR)/%.l

$(FLEX) $(FLEXFLAGS_OS) -i -o$(OBJDIR)/$*.l.c $<

$(CC) $(CFLAGS) -Wno-error -c -o $@ $(OBJDIR)/$*.l.c然后发现新装的Ubuntu中没有bison 这个工具,果断下载安装:

sudo apt-get install bison

安装完成后再make 一次, 发现bison 能编译了,但是编译错误,bison -V 检查版本发现是3.0版本,觉得应该是当前版本的bison太高了,以前的代码不兼容,导致编译错误, 后来卸载了bison,重新安装2.5版本的bison, 安装完成之后再make一次, 发现问题解决,生成了目标文件:

问题3:编译 CarPlay插件时出现以下问题:

/usr/bin/ld: cannot find -lstdc++

在链接时出现了这个问题, 按照网上的说法, 安装缺少的lib库即可。

apt-get install libstdc++-dev 需要说明的是这个libstdc++库是跟具体gcc版本相关的, 笔者的系统中装有几个gcc编译器, 开始没注意,装的lib不是当前使用的gcc 版本, 所以安装前可以用gcc -v 查看下当前使用的gcc 版本, 比如说笔者的gcc 版本是4.8.4, 键入以下命令时:apt-get install libstdc++-dev

得到以下说明, 要求输入制定版本的安装包,

Package libstdc++-dev is a virtual package provided by:

libstdc++-4.8-dev 4.8.4-2ubuntu1~14.04

libstdc++6-4.6-dev 4.6.4-6ubuntu2

libstdc++6-4.4-dev 4.4.7-8ubuntu1

libc++-dev 1.0~svn199600-1

libstdc++6-4.7-dev 4.7.3-12ubuntu1

You should explicitly select one to install.

因此输入apt-get install libstdc++-4.8-dev 就对了。 至此CarPlay插件在linux中编译完成, 得到以下文件:

在Linux环境中测试可以运行。

二. Bonjour 及 插件移植到 Android NKD 环境。     由于Android 4.1已经支持Bonjour, 并且源码环境下编译出来的库文件中已经生成了libdns_sd.so, 这里就不编译了,需要了解的同学自己去源码环境看makefile应该就能明白。以下只给出一些linux c 移植到 Android Naticve c 时大家可能都会遇到的一些问题。

移植时遇到的问题大多是这个原因引起的:linux c使用的c 运行库是 gun libc, Android Native c使用的运行库是bionic,bionic 是一个精简版的c运行库, 很多库函数都没有,需要自己去找替代方法或者重写这些方法,Android NDK 文档中有关于bionic的说明。本文将持续更新, 记录移植到Android Native c时遇到的问题及解决方案。

问题1: Error: selected processor does not support Thumb mode `clz r3,r2'     这个问题产生的原因是使用了 thumb 指令格式不支持的指令模式,Android NDK默认使用Thumb指令格式生成二进制目标,可以在.mk文件中使用LOCAL_ARM_MODE := arm强制指定目标以arm指令格式生成,关于thumbaram指令格式,大家可以百度之。 关于LOCAL_ARM_MODE, Android NDK 文档中有详细的说明:

LOCAL_ARM_MODE

By default, ARM target binaries will be generated in 'thumb' mode, where each instruction are 16-bit wide. You can define this variable to 'arm' if you want to force the generation of the module's object files in 'arm' (32-bit instructions) mode. E.g.:

LOCAL_ARM_MODE := arm

Note that you can also instruct the build system to only build specific sources in ARM mode by appending an '.arm' suffix to its source file name. For example, with:

LOCAL_SRC_FILES := foo.c bar.c.arm

Tells the build system to always compile 'bar.c' in ARM mode, and to build foo.c according to the value of LOCAL_ARM_MODE.

NOTE: Setting APP_OPTIM to 'debug' in your Application.mk will also force the generation of ARM binaries as well. This is due to bugs in the toolchain debugger that don't deal too well with thumb code.

问题2: fatal error: ***.h: No such file or directory

这类问题是因为linux gcc使用glibc运行库, android NDK 使用 bionic 运行库造成的, 有2种表现:1. 2个库中的头文件放置的目录不一样; 2. bionic运行库没有提供那么多功能和头文件。对于第一种情况, 我们先去NDK 根目录搜索一把,看有没有同名的头文件,如果能找到,修改代码文件中的包含目录即可, 如以下头文件:

#include => #include

#include => #include

#include => #include 第二种情况可以先屏蔽include语句, 编译, 查看是否对代码有影响, 有些只是多余的包含,或者不重要的包含文件和功能,可以直接屏蔽,否则太计较小问题,问题太多可能影响进度, 当然, 这样做相当于在这里挖了个坑, 以后不把坑填好的话,有可能会跳下去。笔者的案例中直接屏蔽了一下头文件和功能代码:

#include

#include

n = backtrace( stack, (int) countof( stack ) );

if( n > 0 ) symbols = backtrace_symbols( stack, n );有些功能绕不过去的, 那就只好寻求替代方案了, 如替换以下代码:

pwdPtr = NULL;

if( ( getpwuid_r( getuid(), &pwdStorage, buf, (size_t) len, &pwdPtr ) == 0 ) && pwdPtr )

{

path = pwdPtr->pw_dir;

}为:

pwdPtr = NULL;

pwdPtr = getpwuid(getuid());

if(NULL != pwdPtr)

{

path = pwdPtr->pw_dir;

}有些功能没有替代方案的, 还可以在网上搜索是否有人遇到相同的问题,是否有解决方案,笔者在遇到没有

#include

头文件时, 在github找到了开源的代码: android-ifaddr-master,  拿来用了先, 然后再考虑是否正确的问题。

对于那些找不到替代方案, 又找不到源码问题, 只好去glibc的源码中找了, 把源码拉过来,放到工程目录下编译,经常拔出萝卜带出泥,一坨一坨的代码...

以上暂时就是移植Bonjour 及 CarPlay插件源码到Android Native C时遇到到的重要问题,在移植过程中有很多小问题因为比较容易解决,这里就不写上来了, 以后有问题再更新。有相同经历的同学遇到问题可以在这里讨论下, 需要我的Android.mk的同学请留下邮箱。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。