记一次CMake NDK编译

这次遇到的问题是在基于开源的c库libfluidsynth上做开发,要构建安卓平台的so文件。

通过查阅仓库的wiki,发现上面只讲了linux,windows和macos的编译方法。

各种尝试了几天,感觉在windows下交叉编译难度太大。。。要上linux的感觉

我一个unity党,连vim都没怎么用过,怎么就一下要用linux呢?本想还是让他们另请高明吧。

只是初来乍到,还是要解决问题啊。

先是装了一个虚拟机,装了一个centos7,遇到几个问题:

环境变量总是配得不对,一退出终端又得刷新文件。后来发现得在etc/bashrc里面去配置,不知道为什么网上都不是这么说的。

然后是与win7的共享文件夹,先在vbox里设好共享文件夹,然后mount -t vboxsf "共享名" "本地映射路径"

正巧,又有一个libfluidsynth for android的库代码比较新,拉下来一看,没有mk文件,用的cmake,于是乎装cmake装ndk,这个网上教程多,就不说了

然后说交叉编译要写toolchain文件,于是摸索着改,编到是能编译出来,不确定是不是android平台的。。。

于是又装android studio看Log啊,闹心的是现在vpn管得严,又没有什么可用的镜像,as更新不起啊t.t。好嘛,周末回家又看了下vpn怎么搭建的,租了一个vultr的服务器用SSR搭了个vpn,还真好用,一些久违的网站也再次能看了。。。思绪回到2010年,那时的网站一片欣欣向荣。。。扯远了。。

终于android studio可以更新起了,看log,unity直接报dllnotfound,必然是平台不对啊,file so看一看,x86_64的。。。

后来的后来,终于在网上看到说用NDK提供的toolchain文件,试了试,终于可以了,放Unity里调用成功。。。。

顺带一说,unity中c#是可以直接调用android的so文件的,不是非得通过jar包装。

另外,安卓的so在dllimport的时候,要去掉名字前的lib

#!/bin/bash
rm -rf CMakeCache.txt
rm -rf CMakeFiles
rm -rf cmake_install.cmake
rm -rf Makefile
rm -rf CTestTestfile.cmake

if [[ “$@“ =~ "-d" ]];then
        echo "----------------------------cmake debug----------------------------"
cmake -DDEBUG=ON -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \
      -DANDROID_NDK=$ANDROID_NDK_PATH \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_TOOLCHAIN=clang \
      -DANDROID_PLATFORM=android-21 \
      -DANDROID_STL=c++_shared \
      ..
else
        echo "----------------------------cmake release----------------------------"
cmake -DDEBUG=NO -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_PATH/build/cmake/android.toolchain.cmake \
      -DANDROID_NDK=$ANDROID_NDK_PATH \
      -DANDROID_ABI=armeabi-v7a \
      -DANDROID_TOOLCHAIN=clang \
      -DANDROID_PLATFORM=android-21 \
      -DANDROID_STL=c++_shared \
      ..
fi

make

rm -rf CMakeCache.txt
rm -rf CMakeFiles
rm -rf cmake_install.cmake
rm -rf Makefile
rm -rf CTestTestfile.cmake

在工程目录中建一个build目录,把这个sh放进去运行,OK了~~~

猜你喜欢

转载自blog.csdn.net/yangxun983323204/article/details/80225944