Forum Discussion
Anonymous
6 years agoWhy it seems it's not possible to use CPP in the NDK sources ?
Hi,
I am still messing up with code and trying to get my things work.
My stuff is entirely done in CPP however I noticed all sources in the NDK samples are plain C-99 ..
If I take the VrCubeWorld_Vulkan sample and I try to add to the project a simple "Banana.cpp" file that contains as simple as :
#include <stdio.h>
#include <stdbool.h>
bool InitWorld (void *p)
{
return true;
}
Then I modify the Android.mk file as :
LOCAL_MODULE := vrcubeworldvk
#LOCAL_CFLAGS := -std=c99 -Werror
LOCAL_SRC_FILES := ../../../Src/VrCubeWorld_Vulkan.c \
../../../Src/Banana.cpp \
../../../Src/Framework_Vulkan.c
And then from within I call :
extern bool InitWorld (void *p);
void android_main( struct android_app * app )
{
ALOGV( "----------------------------------------------------------------" );
ALOGV( "android_app_entry()" );
ALOGV( " android_main()" );
InitWorld("Pappinone");
void android_main( struct android_app * app )
{
ALOGV( "----------------------------------------------------------------" );
ALOGV( "android_app_entry()" );
ALOGV( " android_main()" );
InitWorld("Pappinone");
When I try to compile it spews those sort of errors :
Build command failed.
Error while executing process /home/gilesgoat/Android/Sdk/ndk/20.1.5948944/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/Android.mk NDK_APPLICATION_MK=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/Application.mk APP_ABI=arm64-v8a NDK_ALL_ABIS=arm64-v8a NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/lib V=0 -j4 -C/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android APP_PLATFORM=android-21 NDK_TOOLCHAIN_VERSION=clang APP_STL=c++_static NDK_DEBUG=1 OVR_DEBUG=1 USE_ASAN=1 /home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libvrcubeworldvk.so}
make: Entering directory `/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android'
[arm64-v8a] Compile : vrcubeworldvk <= VrCubeWorld_Vulkan.c
[arm64-v8a] Compile++ : vrcubeworldvk <= Banana.cpp
[arm64-v8a] Compile : vrcubeworldvk <= Framework_Vulkan.c
[arm64-v8a] Prebuilt : libvrapi.so <= /home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/../../../../../VrApi/Projects/AndroidPrebuilt/jni/../../../Libs/Android/arm64-v8a/Debug/
[arm64-v8a] StaticLibrary : libandroid_native_app_glue.a
[arm64-v8a] SharedLibrary : libvrcubeworldvk.so
/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/objs-debug/vrcubeworldvk/__/__/__/Src/VrCubeWorld_Vulkan.o: In function `android_main':
/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/../../../Src/VrCubeWorld_Vulkan.c:1429: undefined reference to `InitWorld'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libvrcubeworldvk.so] Error 1
make: Leaving directory `/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android'
Error while executing process /home/gilesgoat/Android/Sdk/ndk/20.1.5948944/ndk-build with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/Android.mk NDK_APPLICATION_MK=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/Application.mk APP_ABI=arm64-v8a NDK_ALL_ABIS=arm64-v8a NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/lib V=0 -j4 -C/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android APP_PLATFORM=android-21 NDK_TOOLCHAIN_VERSION=clang APP_STL=c++_static NDK_DEBUG=1 OVR_DEBUG=1 USE_ASAN=1 /home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libvrcubeworldvk.so}
make: Entering directory `/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android'
[arm64-v8a] Compile : vrcubeworldvk <= VrCubeWorld_Vulkan.c
[arm64-v8a] Compile++ : vrcubeworldvk <= Banana.cpp
[arm64-v8a] Compile : vrcubeworldvk <= Framework_Vulkan.c
[arm64-v8a] Prebuilt : libvrapi.so <= /home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/../../../../../VrApi/Projects/AndroidPrebuilt/jni/../../../Libs/Android/arm64-v8a/Debug/
[arm64-v8a] StaticLibrary : libandroid_native_app_glue.a
[arm64-v8a] SharedLibrary : libvrcubeworldvk.so
/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/objs-debug/vrcubeworldvk/__/__/__/Src/VrCubeWorld_Vulkan.o: In function `android_main':
/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/jni/../../../Src/VrCubeWorld_Vulkan.c:1429: undefined reference to `InitWorld'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libvrcubeworldvk.so] Error 1
make: Leaving directory `/home/gilesgoat/OVR-SDK-Mobile/VrSamples/VrCubeWorld_Vulkan/Projects/Android'
If I "transform" all in .cpp gets even worse, it cannot find all the ovrVK... functions.
Is any way to "properly MIX" cpp and C in the VRAPI samples or the only solution would be to "confine" all the CPP code into a precompiled lib and call the few needed functions via some C wrapper ?
Why the examples do not support CPP ?
If that Banana.cpp is renamed in Banana.c all works ( but you can't use CPP stuff in ).
Cheers.
1 Reply
- AnonymousWell .. in some way I managed to get it working ..Basically I ended up with a "C wrapper" and quite a few " extern "C" { } " and #ifdef _csplus and stuff like that, I still don't know why the sources are not "natively in CPP" but I wonder if I has to do with the JNI interface ?So yeah seems to be fine as long as you keep the native_glue and such in pure C calling just pure C functions from there leaving the CPP stuff "outside".Today 15:57 GMT first time I manage to actually run some Vulkan code on the Quest.
Quick Links
- Horizon Developer Support
- Quest User Forums
- Troubleshooting Forum for problems with a game or app
- Quest Support for problems with your device
Other Meta Support
Related Content
- 3 years agoAnonymous
- 5 months ago