我正在尝试创建一个使用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'
}
我想从scartch构建我的应用程序,所以我不希望得到像这样的样本。
答案 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的唯一方法。