交叉编译遇到的问题

近期给app端做了一个c++的sdk,为了方便后续的win的移植。网络库用了libevent,加密库openssl,序列化库jsoncpp/pb。pc端先运行调试完成。但是移植到移动端的时候遇到了许多问题。下面记录一下。

openssl:

rsa加密:

2048bit情况下,每次加密的字段需要少于245字节,因此对于大于245字节的字段加密时,要分成n段加密,加密后的报文大小是n*256字节

aes:
原生接口特别难用,建议使用EVP_*开头的接口来完成加解密。

ios

这个是问题比较少的。先说这个。

ios 是支持c语法的,因此移植上没有遇到什么问题。 配置好xcode工程,添加相应依赖库即可。

openssl编译脚本: https://github.com/x2on/OpenSSL-for-iPhone

libevent: https://github.com/szuwest/libevent_ios

如果最后要压缩成一个库的话,需要先将静态依赖库用lipo命令先拆分成各个架构上的.a(i386,armv7,arm64...)文件。再将.a文件拆成.o文件,然后用ar命令将所有一样架构的.o文件打包成一个.a静态库,最后lipo - create将所有架构的静态库打包。
这里由于ios工程可以直接将所有依赖的静态库都添加上去,所以不需要这个复杂的步骤也可以通过。

android

这个坑好多,libevent编译参考了 这个博客,https://www.cnblogs.com/swordy/p/4326290.html。但是这个有点问题会导致libevent没有可用的网络io模式可用。 android本质是个linux系统。因此也支持了poll,select。需要在event-config.h中添加一行#define _EVENT_HAVE_SELECT 1来支持select。

2.感觉android对c++支持的不是很好,首先安卓默认首推使用stlport来开发,但是stlport不支持很多c++11语法,因此选择了gnustl。其次很多偏门的头文件甚至如uuid.h都找不到。

3.遇到了一个问题,用std::thread起来的线程做libevent的loop线程会导致内部select失败(错误码,参数错误), 换成pthread方法才可以。(这个好坑啊)

3.应该是jni开发的常见问题了。在java外部创建的线程如果想调用java方法,需要首先调用 jvm->AttachCurrentThread,否则会产生异常。

你可能感兴趣的:(交叉编译遇到的问题)