Vulkan CMakeLists.txt?

时间:2018-02-21 13:04:16

标签: android cmake vulkan

我正在尝试创建一个使用Vulkan API进行渲染的android应用程序,但我总是得到“未定义的'vkCreateInstance''消息。”

这是我的CMakeList.txt:

cmake_minimum_required(VERSION 3.4.1)

add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp)

add_library( vulkan_activity
             SHARED
             src/main/cpp/vulkan_activity.cpp)

add_library( vulkan_stuff
             SHARED
             src/main/cpp/vulkan_stuff.cpp)

add_library( vulkan_buffers
             SHARED
             src/main/cpp/vulkan_buffers.cpp)

find_library( log-lib
              log )

target_link_libraries( native-lib
                       vulkan_stuffx
                       vulkan_activity
                       vulkan_buffers
                       vulkan
                           ${log-lib})

这是我的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.game.productions.phenyl.futuroland"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions -v"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.google.android.gms:play-services-location:11.8.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

enter image description here

我想从scartch构建我的应用程序,所以我不希望得到像这样的样本。

1 个答案:

答案 0 :(得分:0)

Android在API 26及更高版本(Nougat)上只有libvulkan.so。有些设备在Marshmallow上支持它,但是你不能保证libvulkan.so将出现在API< 26,所以NDK不会让你链接它,除非你的NDK目标平台是> = 26,否则你的应用甚至不会在你说你想要的许多设备上启动运行(minSdkVersion 16)。

如果将minSdkVersion设置为26,则您的本机代码应该针对该版本的NDK标头/库构建,并且libvulkan.so将在链接时可用。

或者,如果您在Nougat设备上运行时只小心尝试加载链接libvulkan.so的共享库,则可以单独留下minSdkVersion并添加externalNativeBuild { cmake { arguments "-DANDROID_PLATFORM=android-26" } } 。您需要仔细测试前Nougat设备或仿真器图像,因为它很容易意外地导致在早期版本的操作系统上不存在的库依赖项。

或者,不是直接链接libvulkan.so,而是可以使用dlopen在运行时加载libvulkan.so,如果失败则使用回退或优雅退出,然后使用dlsym()获取指向vkGetInstanceProcAddr的指针,并且使用它加载其他所有内容。这是在拥有它的Marshmallow设备上使用Vulkan的唯一方法。