From 65129d1b52da190c3bd205eec6d59540131ec9a1 Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Fri, 14 Feb 2020 14:54:35 -0800 Subject: [PATCH] filament-utils-android: fix recent crash regression. --- .../src/main/cpp/Utils.cpp | 6 ++++++ android/gltfio-android/CMakeLists.txt | 4 ++++ android/gltfio-android/libgltfio-jni.map | 2 +- .../gltfio-android/src/main/cpp/AssetLoader.cpp | 3 --- android/gltfio-android/src/main/cpp/Gltfio.cpp | 16 ++++++++++++++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/android/filament-utils-android/src/main/cpp/Utils.cpp b/android/filament-utils-android/src/main/cpp/Utils.cpp index 622d3c454e..4af63b5e5c 100644 --- a/android/filament-utils-android/src/main/cpp/Utils.cpp +++ b/android/filament-utils-android/src/main/cpp/Utils.cpp @@ -31,12 +31,18 @@ using namespace image; extern void registerCallbackUtils(JNIEnv*); extern void registerNioUtils(JNIEnv*); +namespace gltfio { + void JNI_OnLoad(JNIEnv* env); +} + jint JNI_OnLoad(JavaVM* vm, void*) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { return -1; } + gltfio::JNI_OnLoad(env); + registerCallbackUtils(env); registerNioUtils(env); diff --git a/android/gltfio-android/CMakeLists.txt b/android/gltfio-android/CMakeLists.txt index 20af813ea1..38c3671527 100644 --- a/android/gltfio-android/CMakeLists.txt +++ b/android/gltfio-android/CMakeLists.txt @@ -73,6 +73,10 @@ target_include_directories(gltfio-jni PRIVATE set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.symbols) +# Force a relink when the version script is changed. +set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map) + # The ordering in the following list is important because CMake does not have dependency information. target_link_libraries(gltfio-jni filament-jni diff --git a/android/gltfio-android/libgltfio-jni.map b/android/gltfio-android/libgltfio-jni.map index 3bdada020f..397519593b 100644 --- a/android/gltfio-android/libgltfio-jni.map +++ b/android/gltfio-android/libgltfio-jni.map @@ -1,4 +1,4 @@ LIBGLTFIO { - global: Java_com_google_android_filament_*; JNI*; + global: Java_com_google_android_filament_*; *gltfio*; JNI*; local: *; }; diff --git a/android/gltfio-android/src/main/cpp/AssetLoader.cpp b/android/gltfio-android/src/main/cpp/AssetLoader.cpp index aa8e7bf0b9..84bc979ac1 100644 --- a/android/gltfio-android/src/main/cpp/AssetLoader.cpp +++ b/android/gltfio-android/src/main/cpp/AssetLoader.cpp @@ -30,9 +30,6 @@ using namespace filament; using namespace gltfio; using namespace utils; -extern void registerCallbackUtils(JNIEnv*); -extern void registerNioUtils(JNIEnv*); - extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_gltfio_AssetLoader_nCreateAssetLoader(JNIEnv*, jclass, jlong nativeEngine, jlong nativeProvider, jlong nativeEntities) { diff --git a/android/gltfio-android/src/main/cpp/Gltfio.cpp b/android/gltfio-android/src/main/cpp/Gltfio.cpp index 65dcb280e8..282489c00b 100644 --- a/android/gltfio-android/src/main/cpp/Gltfio.cpp +++ b/android/gltfio-android/src/main/cpp/Gltfio.cpp @@ -16,11 +16,27 @@ #include +#include + +extern void registerNioUtils(JNIEnv*); + jint JNI_OnLoad(JavaVM* vm, void*) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { return -1; } + registerNioUtils(env); + return JNI_VERSION_1_6; } + +// This alternative init function is necessary when gltfio is loaded using an ELF dependency. +namespace gltfio { + + UTILS_PUBLIC + void JNI_OnLoad(JNIEnv* env) { + registerNioUtils(env); + } + +}