最近在某家公司做实习生,从事移植工作,公司要求将以前跑在linux老设备上的程序移植到android平台上。项目很大一部分是c++写的,所以需要用ndk把所有源代码编到android平台下,当然也包括所依赖的第三方库。第三方库还比较好说,因为boost,openssl,websocket这些库要么对android有很好的支持,要么有开源项目去辅助支持。所以主要工作还是编译源代码问题,代码量相当庞大。
因为在学校的时候很少做c++开发和编译工作,所以解决问题很困难,这几天就有一个很怪异的问题缠绕着我。
问题是这样的,由于保密措施,项目代码都是分离的,每个人都只有自己的一部分。所以我的同事需要用ndk编好他的代码和他依赖的第三方库,编程.a库,然后另一个同事再依赖前一个同事 的.a库和第三方库,这样一层一层……….最后我拿到这个模块的库再去编。
结果出问题了,在用jni去调这个库的时候:
cao,这是怎么回事?他说找不到这个符号,但打开.a文件,可以看到这个符号。于是就怀疑库是不是没引进来,问了下同事,同事说.a的库编译的时候其他库都会引进来。但看了看文件大小,模块的.a库只有7M,但那些第三方库却有几百M,很明显,没引进来。google了一下,是mk文件有问题。
最后一句include $(PREBUILT_STATIC_LIBRARY),
预编译的模块不会出发构建过程。只是把预编译的共享库拷贝到$PROJECT/obj/local路径,静态库则是拷贝到$PROJECT/libs/并进行裁剪。
所以,如果我要编这个模块的话,要把每个同事所依赖的.a全部引进来。没错,全部。
测试通过,成功跑起。