summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2016-11-15 19:09:29 +0100
committerBruno de Oliveira Abinader <bruno@mapbox.com>2016-11-17 01:04:16 +0100
commitc401431a089368458af559fc66a7142fb9c5cfdc (patch)
treef7f4b42951ed89aa67739fad9c7367e43a571b20
parent0df356ce91a967dabb14e585ab39f25a9eaf6d57 (diff)
downloadqtlocation-mapboxgl-c401431a089368458af559fc66a7142fb9c5cfdc.tar.gz
[android] separate on_Load from main logic
-rw-r--r--Makefile23
-rw-r--r--platform/android/config.cmake55
-rwxr-xr-xplatform/android/src/jni.cpp22
-rw-r--r--platform/android/src/jni.hpp6
-rw-r--r--platform/android/src/main.cpp9
-rw-r--r--platform/android/src/test/Main.java2
-rw-r--r--platform/android/src/test/main.jni.cpp3
7 files changed, 96 insertions, 24 deletions
diff --git a/Makefile b/Makefile
index 83b55db5bb..b54f800e0c 100644
--- a/Makefile
+++ b/Makefile
@@ -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);