在buck编译jni代码时,遇到了一些困难,特意记录如下.
编译ndk使用的是buck中的ndk-library标签,对于android项目,一般的native代码是位于项目的jni目录中,对于存在多个工程的项目,则可以使用//与:来指定编译native代码的BUCK脚本所在目录,如工程目录结构为
A目录下会存在多个工程项目,工程项目下可能存在jni.
我将BUCK的脚本放置在jni目录下,因为在执行构建的时候会去找BUCK脚本所在位置下是否存在Android.mk(可能存在其他参数指定,没细看,放着也没差),脚本内容如下:
1 | ndk_library( |
其各含义可以到buckbuild中查看文档.
如此,在A目录下就可以执行使用1
buck build //A/jni:build-softlink
即会开始构建.
这时遇到几个问题,此处也记录一下.
A1:
这个是因为没有指定ndk目录,将local.properties里添加上ndk.dir,需要放置在BUCK构建目录的最顶层,此处为A,当然也可以 直接设置环境变量
A2:
BUCK默认的toolchain为4.8,但我装的NDKr10最低也4.9了,所以就找不到了,开始的时候以为是设置设少了什么东西,在确定不是我误指定4.8后我怀疑是BUCK的默认设置,于是就去BUCK源码找,默认的版本指定在./src/com/facebook/buck/android/NdkCxxPlatforms.java里的
再以这个常量为索引查找引用的地方,可以发现
看到这里不就用继续向下看了,优先使用的是buck的配置,但这个配置是什么配置呢,突然想起buck有.buckconfig,于是查一下文档,果然,这里在[ndk]的section,在那里指定toolchain即可
A3:
ld找不到库,从错误提示可以看出,找不到的是libandroid.so,于是去ndk里找,找倒是找到很多,但版本选择很重要,因为我们要编译的是arm的so,所以需要找arm的,然后把其软链到/usr/lib即可,注意不要用了x86,软链时也要用绝对路径.