为unity2020.1 Android 编译c++代码

交叉编译因为其繁琐、复杂的工作,总是那么让人望而生畏。所以,安卓版的编译,我也一直拖了很久。直到今天。顺便记录下来,方便以后编译新的工程。

准备c++工程

  1. 必须是cmake工程。
    cmake是android官方支持的。官方cmake版本有3.6和3.10,不要使用超过3.10以上的功能。
  2. 可以包含多个子工程,只要是标准的cmake工程组织方式即可。可以生成多个共享库(.so文件)。这里包含了两个工程,生成了两个so文件。

我的工程本身就是cmake工程,这方面倒是现成的。cmake的适用面很宽,msvs支持打开cmake工程,大部分编译工具链也都支持cmake。

创建安卓工程

  1. 下载安卓android studio,我手头上有3.3版,就直接用了。
  2. 创建新工程,选择c++工程。最好和前面的c++代码在同一个父目录下
  3. 注释掉MainActivity中的Native代码,因为我们不编译工程自带的代码。

    static {
        //System.loadLibrary("native-lib");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        //tv.setText(stringFromJNI());
    }
    
    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    //public native String stringFromJNI();

    修改安卓工程配置文件

    指定cmake路径 :local.properties

    这里使用cmake3.8(3.8以上才能识别c++17),而安卓默认的是3.6,只能手工指定:

    cmake.dir=D\:\\prog\\Android\\sdk\\cmake\\3.10.2.4988404

修改 app/build.gradle:

编译

直接在android studio中点击build->make project就行了

编译后的文件在:app.externalNativeBuild\cmake。
复制自己需要的版本,到unity的Plugins目录下,并设置安卓平台适用,即可。

编译release版

在Android Studio的左下角,有一个Build Variants,可以选择build类型。也可以如下:

externalNativeBuild {
            cmake {
                //arguments "-DCMAKE_BUILD_TYPE=Release"
                version "3.10.2"
                cppFlags ""
            }
        }

指定cpu架构

默认编译了四种架构,这样让打包测试的时间变得更长,我们可以只选择armv7,加快测试速度。

android {
    defaultConfig {
        ndk {
            abiFilters 'arm64-v8a', 'x86_64'
        }
    }
}
armeabi-v7a
armeabi-v7a with NEON -DANDROID_ABI=armeabi-v7a -DANDROID_ARM_NEON=ON 相同。
arm64-v8a
x86
x86_64

最终效果

app/build.gradle

后话

.
整个过程,主要就是准备sdk ndk,可以让unity hub来安装,我们找到目录直接使用即可,也可以参考这篇文章
另外一个主要工作就是修复编译错误,如果是第一次编译,应该会有很多。clang和msvc对c++标准诠释有很多不一致的地方。相对来说,msvc更宽松,clang更严格,需要针对clang报告的错误修改部分代码。
c++17及以下内容,msvc和clang都有了,安卓clang中没有filesystem,这是c++17的内容,如果用到了,要去掉。否则会报告链接失败。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

31 − 28 =