先去跑起来openxr提供的hello_xr示例工程再继续
参考meta(原facebook)官方对于android studio编译器配置进行配置安装。
meta链接跳转,有墙
了解android工程结构再继续看
自己先动手实验配置再继续看,不保证方法步骤全部适用,但是自己从零开始并运行起来的,我使用的是valkan引擎,openGl或者其他引擎的话,以下内容部分步骤可以参考。
1.首先启用native C++空模板
要让项目运行起来,最核心的就是,添加配置openxr的sdk以及vulkan(如果是opengl,那就添加opengl),没有其他多余的库需要添加了。
2.根据hello_xr中main.cpp所引用的文件,把需要的文件以及所在的目录全部拷贝到当前src/main/cpp目录下.
3.在cpp目录下的cmakelists中
使用include_directories()
引用新加入目录
include_directories(common)
include_directories(openXR_include)
include_directories(openXR_src)
include_directories(vulkan_shaders)
调用拷贝的openxr的头文件(此项目中的opensdk是.so文件+openXR_include目录里面的头文件,这些头文件是hello_xr实力工程中里面没有的,感觉像是meta团队和hello_xr更新维护不同步)
find_library(ANDROID_LIBRARY NAMES android)
find_library(ANDROID_LOG_LIBRARY NAMES log)
add_library(openxr_loader SHARED IMPORTED)
set_target_properties(openxr_loader PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/openXR_src/${ANDROID_ABI}/${CMAKE_BUILD_TYPE}/libopenxr_loader.so)
find_path(ANDROID_NATIVE_APP_GLUE android_native_app_glue.h PATHS ${ANDROID_NDK}/sources/android/native_app_glue)
add_library(android_native_app_glue OBJECT "${ANDROID_NATIVE_APP_GLUE}/android_native_app_glue.c")
target_include_directories(android_native_app_glue PUBLIC ${ANDROID_NATIVE_APP_GLUE})
target_compile_options(android_native_app_glue PRIVATE -Wno-unused-parameter)
使用add_library()
引用新拷贝的cpp文件
add_library( # Sets the name of the library.
myxrdemo
MODULE
native-lib.cpp
graphicsplugin_factory.cpp
graphicsplugin_vulkan.cpp
logger.cpp
openxr_program.cpp
platformplugin_android.cpp
platformplugin_factory.cpp)
添加vulkan
find_package(Vulkan)
最后链接
target_link_libraries( # Specifies the target library.
myxrdemo
android_native_app_glue
openxr_loader
${Vulkan_LIBRARY}
${ANDROID_LIBRARY} ${ANDROID_LOG_LIBRARY})
4.build.gradle中
设置依赖项,android{}
这行以上的配置,基本按照hello_xr设置的依赖
- c++的版本要设置成17,这样拷贝hello_xr的有些C++的语法才不会报错
- 在
externalNativeBuild {}
中设置ndk,主要是设置openXR_src的路径,根据工程当前所处的环境,调用里面不同的.so文件。 - 在
android{}
中设置ndkVersion "21.4.7075529"
版本号可以自己选定,不需要一模一样,根据报错信息换ndk的版本(前提是已经下载了对应的ndk版本)。
5.在main目录下的AndroidManifest.xml中
下面这行代码将 android:hasCode 声明为 false,因为此应用只包含原生代码,而不含 Java 代码。
<application android:label="@string/app_name"appname//tips:(@string/app_name"appname是原生自带的项目名称,不用和这一样)
android:hasCode="false">
<activity android:name="android.app.NativeActivity"
如果Logcat提示Didn’t find class “androidx.startup.InitializationProvider”
就是用下面这行代码,忽视 androidx.startup.InitializationProvider
<provider android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
指定 android:value 作为要构建的共享库的名称
<activity
android:name="android.app.NativeActivity"
android:configChanges="screenSize|screenLayout|orientation|keyboardHidden|keyboard|navigation|uiMode|density"
android:excludeFromRecents="false"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:exported="true"
tools:ignore="NonResizeableActivity">
<meta-data
android:name="android.app.lib_name"
android:value="myxrdemo" />
<meta-data
android:name="com.oculus.vr.focusaware"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="com.oculus.intent.category.VR" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- <category android:name="org.khronos.openxr.intent.category.IMMERSIVE_HMD" />-->
6.
对于naticeC++空项目来说,调用的是Java_com_example_myapplication_MainActivity_stringFromJNI()
但是现在需要android_main作为程序的入口,所以需要引入
#include <android_native_app_glue.h>
(解释放上面cmake中为什么引入android_native_app_glue.h)