diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2016-11-15 19:09:29 +0100 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-11-17 01:04:16 +0100 |
commit | c401431a089368458af559fc66a7142fb9c5cfdc (patch) | |
tree | f7f4b42951ed89aa67739fad9c7367e43a571b20 | |
parent | 0df356ce91a967dabb14e585ab39f25a9eaf6d57 (diff) | |
download | qtlocation-mapboxgl-c401431a089368458af559fc66a7142fb9c5cfdc.tar.gz |
[android] separate on_Load from main logic
-rw-r--r-- | Makefile | 23 | ||||
-rw-r--r-- | platform/android/config.cmake | 55 | ||||
-rwxr-xr-x | platform/android/src/jni.cpp | 22 | ||||
-rw-r--r-- | platform/android/src/jni.hpp | 6 | ||||
-rw-r--r-- | platform/android/src/main.cpp | 9 | ||||
-rw-r--r-- | platform/android/src/test/Main.java | 2 | ||||
-rw-r--r-- | platform/android/src/test/main.jni.cpp | 3 |
7 files changed, 96 insertions, 24 deletions
@@ -503,6 +503,29 @@ android-lib-$1: build/android-$1/$(BUILDTYPE)/Makefile android-$1: android-lib-$1 cd platform/android && ./gradlew --parallel --max-workers=$(JOBS) assemble$(BUILDTYPE) +run-android-core-test-$1: android-lib-$1 android-test-lib-$1 + # Compile main sources and extract the classes (using the test app to get all transitive dependencies in one place) + cd platform/android && ./gradlew assembleDebug + unzip -o platform/android/MapboxGLAndroidSDKTestApp/build/outputs/apk/MapboxGLAndroidSDKTestApp-debug.apk classes.dex -d build/android-$1/$(BUILDTYPE) + + #Compile Test runner + javac -sourcepath platform/android/src/test -d build/android-$1/$(BUILDTYPE) -source 1.7 -target 1.7 platform/android/src/test/Main.java + #Combine and dex + cd build/android-$1/$(BUILDTYPE) && dx --dex --output=test.jar *.class classes.dex + + #Ensure clean state on the device + adb shell "rm -Rf $(ANDROID_LOCAL_WORK_DIR)" + adb shell "mkdir -p $(ANDROID_LOCAL_WORK_DIR)/test" + + #Push all needed files to the device + adb push build/android-$1/$(BUILDTYPE)/test.jar $(ANDROID_LOCAL_WORK_DIR) + adb push test/fixtures $(ANDROID_LOCAL_WORK_DIR)/test + adb push build/android-$1/$(BUILDTYPE)/libmapbox-gl.so $(ANDROID_LOCAL_WORK_DIR) + adb push build/android-$1/$(BUILDTYPE)/libmbgl-test.so $(ANDROID_LOCAL_WORK_DIR) + + #Kick off the tests + adb shell "export LD_LIBRARY_PATH=/system/lib:$(ANDROID_LOCAL_WORK_DIR) && cd $(ANDROID_LOCAL_WORK_DIR) && dalvikvm32 -cp $(ANDROID_LOCAL_WORK_DIR)/test.jar Main" + .PHONY: run-android-$1 run-android-$1: android-$1 cd platform/android && ./gradlew :MapboxGLAndroidSDKTestApp:installDebug && adb shell am start -n com.mapbox.mapboxsdk.testapp/.activity.FeatureOverviewActivity diff --git a/platform/android/config.cmake b/platform/android/config.cmake index a2190c014e..38cbb564a3 100644 --- a/platform/android/config.cmake +++ b/platform/android/config.cmake @@ -1,5 +1,7 @@ add_definitions(-DMBGL_USE_GLES2=1) +include(cmake/test-files.cmake) + #Include to use build specific variables include(${CMAKE_CURRENT_BINARY_DIR}/toolchain.cmake) @@ -11,6 +13,8 @@ mason_use(nunicode VERSION 1.7.1) mason_use(sqlite VERSION 3.14.2) mason_use(gtest VERSION 1.7.0) +## mbgl core ## + macro(mbgl_platform_core) target_sources(mbgl-core @@ -145,7 +149,9 @@ endmacro() ## Main library ## -add_library(mapbox-gl SHARED) +add_library(mapbox-gl SHARED + platform/android/src/main.cpp +) target_compile_options(mapbox-gl PRIVATE -fvisibility=hidden @@ -157,7 +163,24 @@ target_link_libraries(mapbox-gl ) ## Test library ## -add_library(mbgl-test SHARED) + +add_library(mbgl-test SHARED + # Actual tests + ${MBGL_TEST_FILES} + + # Utilities + test/include/mbgl/test.hpp + test/src/mbgl/test/test.cpp + + # Main test entry point + platform/android/src/test/main.jni.cpp + + # Headless view + platform/default/offscreen_view.cpp + platform/default/headless_backend.cpp + platform/linux/src/headless_backend_egl.cpp + platform/linux/src/headless_display_egl.cpp +) target_compile_options(mbgl-test PRIVATE -fvisibility=hidden @@ -170,27 +193,23 @@ target_include_directories(mbgl-test PRIVATE test/include PRIVATE test/src PRIVATE platform/default + PRIVATE ${MBGL_GENERATED}/include ) -target_sources(mbgl-test - # Actual tests - ${MBGL_TEST_FILES} - - # Main test entry point - PRIVATE platform/android/src/test/main.jni.cpp - - # Headless view - PRIVATE platform/linux/src/headless_backend_egl.cpp - PRIVATE platform/linux/src/headless_display_egl.cpp - -) - -target_add_mason_package(mbgl-test PUBLIC rapidjson) - target_link_libraries(mbgl-test PRIVATE mbgl-core ) +target_add_mason_package(mbgl-test PRIVATE geometry) +target_add_mason_package(mbgl-test PRIVATE variant) +target_add_mason_package(mbgl-test PRIVATE unique_resource) +target_add_mason_package(mbgl-test PRIVATE rapidjson) +target_add_mason_package(mbgl-test PRIVATE gtest) +target_add_mason_package(mbgl-test PRIVATE pixelmatch) +target_add_mason_package(mbgl-test PRIVATE boost) +target_add_mason_package(mbgl-test PRIVATE geojson) +target_add_mason_package(mbgl-test PRIVATE geojsonvt) + ## Custom layer example ## add_library(example-custom-layer SHARED @@ -206,6 +225,8 @@ target_link_libraries(example-custom-layer PRIVATE mbgl-core ) +## Strip and copy ## + set(ANDROID_SDK_PROJECT_DIR ${CMAKE_SOURCE_DIR}/platform/android/MapboxGLAndroidSDK) set(ANDROID_JNI_TARGET_DIR ${ANDROID_SDK_PROJECT_DIR}/src/main/jniLibs/${ANDROID_JNIDIR}/) set(ANDROID_ASSETS_TARGET_DIR ${ANDROID_SDK_PROJECT_DIR}/src/main/assets/) diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 44a1915b4f..134b72a5e9 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1264,6 +1264,7 @@ void listOfflineRegions(JNIEnv *env, jni::jobject* obj, jlong defaultFileSourceP defaultFileSource->listOfflineRegions([obj, defaultFileSourcePtr, listCallback](std::exception_ptr error, mbgl::optional<std::vector<mbgl::OfflineRegion>> regions) mutable { // Reattach, the callback comes from a different thread + assert(theJVM != nullptr); JNIEnv *env2; jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); if (renderDetach) { @@ -1355,6 +1356,7 @@ void createOfflineRegion(JNIEnv *env, jni::jobject* obj, jlong defaultFileSource // Reattach, the callback comes from a different thread JNIEnv *env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); if (renderDetach) { mbgl::Log::Debug(mbgl::Event::JNI, "Attached."); @@ -1446,6 +1448,7 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo mbgl::Log::Debug(mbgl::Event::JNI, "~Observer()"); // Env JNIEnv* env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); jni::DeleteGlobalRef(*env2, std::move(observerCallback)); detach_jni_thread(theJVM, &env2, renderDetach); @@ -1454,6 +1457,7 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo void statusChanged(mbgl::OfflineRegionStatus status) override { // Env JNIEnv* env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); // Conver to jint @@ -1489,6 +1493,7 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo void responseError(mbgl::Response::Error error) override { // Env JNIEnv* env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); // Handle the value of reason independently of the underlying int value @@ -1528,6 +1533,7 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo void mapboxTileCountLimitExceeded(uint64_t limit) override { // Env JNIEnv* env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); // Send limit @@ -1586,6 +1592,7 @@ void getOfflineRegionStatus(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobj // Reattach, the callback comes from a different thread JNIEnv *env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); if (renderDetach) { mbgl::Log::Debug(mbgl::Event::JNI, "Attached."); @@ -1640,6 +1647,7 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobject // Reattach, the callback comes from a different thread JNIEnv *env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); if (renderDetach) { mbgl::Log::Debug(mbgl::Event::JNI, "Attached."); @@ -1683,6 +1691,7 @@ void updateOfflineRegionMetadata(JNIEnv *env, jni::jobject* offlineRegion_, jni: defaultFileSource->updateOfflineMetadata(id, metadata, [updateCallback] (std::exception_ptr error, mbgl::optional<mbgl::OfflineRegionMetadata> data) mutable { // Reattach, the callback comes from a different thread JNIEnv *env2; + assert(theJVM != nullptr); jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread"); if (renderDetach) { mbgl::Log::Debug(mbgl::Event::JNI, "Attached."); @@ -1704,9 +1713,13 @@ void updateOfflineRegionMetadata(JNIEnv *env, jni::jobject* offlineRegion_, jni: // Offline calls end -} +} //anonymous + +namespace mbgl { +namespace android { -extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { +void registerNatives(JavaVM *vm) { + assert(vm != nullptr); theJVM = vm; jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6); @@ -1989,6 +2002,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { char release[PROP_VALUE_MAX] = ""; __system_property_get("ro.build.version.release", release); androidRelease = std::string(release); - - return JNI_VERSION_1_6; } + +} //android +} //mbgl diff --git a/platform/android/src/jni.hpp b/platform/android/src/jni.hpp index 0810ee656d..90ec914cf2 100644 --- a/platform/android/src/jni.hpp +++ b/platform/android/src/jni.hpp @@ -23,6 +23,8 @@ extern jmethodID onSnapshotReadyId; extern bool attach_jni_thread(JavaVM* vm, JNIEnv** env, std::string threadName); extern void detach_jni_thread(JavaVM* vm, JNIEnv** env, bool detach); + +extern void registerNatives(JavaVM* vm); -} -} +} //android +} //mbgl diff --git a/platform/android/src/main.cpp b/platform/android/src/main.cpp new file mode 100644 index 0000000000..03a8288719 --- /dev/null +++ b/platform/android/src/main.cpp @@ -0,0 +1,9 @@ +#include "jni.hpp" +#include <jni/jni.hpp> + +extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) { + assert(vm != nullptr); + mbgl::android::registerNatives(vm); + return JNI_VERSION_1_6; +} + diff --git a/platform/android/src/test/Main.java b/platform/android/src/test/Main.java index e20aa7db3f..66f13b1533 100644 --- a/platform/android/src/test/Main.java +++ b/platform/android/src/test/Main.java @@ -5,7 +5,7 @@ public class Main { //Need to load the mapbox-gl library explicitly first System.loadLibrary("mapbox-gl"); //Load the tests - System.loadLibrary("test-jni-lib"); + System.loadLibrary("mbgl-test"); System.out.println("Libraries loaded"); //Run the tests new Main().runAllTests(); diff --git a/platform/android/src/test/main.jni.cpp b/platform/android/src/test/main.jni.cpp index aa4d9d07c2..aefdab1be3 100644 --- a/platform/android/src/test/main.jni.cpp +++ b/platform/android/src/test/main.jni.cpp @@ -1,3 +1,4 @@ +#include "../jni.hpp" #include <jni/jni.hpp> #include <mbgl/test.hpp> @@ -11,6 +12,8 @@ void runAllTests(JNIEnv *env, jni::jobject* obj) { extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { std::cout << "Loading tests"; + mbgl::android::theJVM = vm; + struct Main { static constexpr auto Name() { return "Main"; } }; jni::JNIEnv& env = jni::GetEnv(*vm, jni::jni_version_1_6); |