Merge pull request #180 from alexey-pelykh/newNdkBranch

NEON support, fixed bug in JNI signature, release compilation of native ...
This commit is contained in:
vshcherb 2012-03-01 03:29:01 -08:00
commit b9f1dfc3e9
11 changed files with 144 additions and 170 deletions

View file

@ -1 +1,12 @@
include $(all-subdir-makefiles) OSMAND_MAKEFILES := $(all-subdir-makefiles)
# By default, include makefiles only once
include $(OSMAND_MAKEFILES)
# If we may support NEON, include them once more
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
OSMAND_NEON := true
include $(OSMAND_MAKEFILES)
endif

View file

@ -1,3 +1,8 @@
APP_STL := stlport_shared APP_STL := stlport_shared
APP_ABI := armeabi APP_ABI := armeabi armeabi-v7a
APP_CPPFLAGS := -fno-rtti -fno-exceptions APP_CPPFLAGS := -fno-rtti -fno-exceptions
ifndef OSMAND_DEBUG_NATIVE
# Force release compilation in release optimizations, even if application is debuggable by manifest
APP_OPTIM := release
endif

View file

@ -0,0 +1,22 @@
# This is built only for ARMv5
ifneq ($(TARGET_ARCH_ABI),armeabi-v7a)
ifneq ($(LOCAL_ARM_NEON),true)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Name of the local module
LOCAL_MODULE := cpufeatures_proxy
LOCAL_SRC_FILES := \
cpuCheck.cpp
LOCAL_STATIC_LIBRARIES := cpufeatures
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/cpufeatures)
endif
endif

View file

@ -0,0 +1,18 @@
#include <jni.h>
#include <cpu-features.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_getCpuCount( JNIEnv* ienv, jobject obj) {
return android_getCpuCount();
}
JNIEXPORT jboolean JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_cpuHasNeonSupport( JNIEnv* ienv, jobject obj) {
return (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) == ANDROID_CPU_ARM_FEATURE_NEON) ? JNI_TRUE : JNI_FALSE;
}
#ifdef __cplusplus
}
#endif

View file

@ -13,7 +13,12 @@ ifeq ($(SKIA_ABS),)
endif endif
# Name of the local module # Name of the local module
ifneq ($(OSMAND_NEON),true)
LOCAL_MODULE := osmand LOCAL_MODULE := osmand
else
LOCAL_MODULE := osmand_neon
LOCAL_ARM_NEON := true
endif
# Include paths # Include paths
LOCAL_C_INCLUDES := $(LOCAL_PATH) \ LOCAL_C_INCLUDES := $(LOCAL_PATH) \
@ -26,9 +31,12 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(SKIA_ABS)/trunk/src/core $(SKIA_ABS)/trunk/src/core
LOCAL_CPP_EXTENSION := .cpp LOCAL_CPP_EXTENSION := .cpp
LOCAL_SRC_FILES := common.cpp mapObjects.cpp \ LOCAL_SRC_FILES := \
renderRules.cpp rendering.cpp \ common.cpp \
binaryRead.cpp mapObjects.cpp \
renderRules.cpp \
rendering.cpp \
binaryRead.cpp
LOCAL_CFLAGS := \ LOCAL_CFLAGS := \
-DGOOGLE_PROTOBUF_NO_RTTI \ -DGOOGLE_PROTOBUF_NO_RTTI \
@ -39,7 +47,11 @@ LOCAL_CFLAGS := \
-DSK_RELEASE \ -DSK_RELEASE \
-DGR_RELEASE=1 -DGR_RELEASE=1
ifneq ($(LOCAL_ARM_NEON),true)
LOCAL_STATIC_LIBRARIES := proto skia LOCAL_STATIC_LIBRARIES := proto skia
else
LOCAL_STATIC_LIBRARIES := proto_neon skia_neon
endif
LOCAL_LDLIBS := -llog LOCAL_LDLIBS := -llog

View file

@ -105,7 +105,7 @@ void RenderingRulesStorage::initProperties() {
uint i = 0; uint i = 0;
for (; i < sz; i++) { for (; i < sz; i++) {
jobject rulePrope = globalEnv()->CallObjectMethod(listProps, List_get, i); jobject rulePrope = globalEnv()->CallObjectMethod(listProps, List_get, i);
bool input = globalEnv()->GetIntField(rulePrope, RenderingRuleProperty_input); bool input = (globalEnv()->GetBooleanField(rulePrope, RenderingRuleProperty_input) == JNI_TRUE);
int type = globalEnv()->GetIntField(rulePrope, RenderingRuleProperty_type); int type = globalEnv()->GetIntField(rulePrope, RenderingRuleProperty_type);
std::string name = getStringField(rulePrope, RenderingRuleProperty_attrName); std::string name = getStringField(rulePrope, RenderingRuleProperty_attrName);
RenderingRuleProperty* prop = new RenderingRuleProperty(type, input, name, i); RenderingRuleProperty* prop = new RenderingRuleProperty(type, input, name, i);

View file

@ -711,11 +711,15 @@ JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_genera
bitmap->setConfig(SkBitmap::kARGB_8888_Config, requestedBitmapWidth, requestedBitmapHeight); bitmap->setConfig(SkBitmap::kARGB_8888_Config, requestedBitmapWidth, requestedBitmapHeight);
else else
bitmap->setConfig(SkBitmap::kRGB_565_Config, requestedBitmapWidth, requestedBitmapHeight); bitmap->setConfig(SkBitmap::kRGB_565_Config, requestedBitmapWidth, requestedBitmapHeight);
bitmap->allocPixels();
sprintf(debugMessage, "Allocated %d bytes!", bitmap->getSize()); void* bitmapData = malloc(bitmap->getSize());
//TODO: Quite possible increase of speed - [re]allocate buffer only if size changed in greated direction?
sprintf(debugMessage, "Allocated %d bytes at %p", bitmap->getSize(), bitmapData);
__android_log_print(ANDROID_LOG_WARN, "net.osmand", debugMessage); __android_log_print(ANDROID_LOG_WARN, "net.osmand", debugMessage);
bitmap->setPixels(bitmapData);
SkCanvas* canvas = new SkCanvas(*bitmap); SkCanvas* canvas = new SkCanvas(*bitmap);
canvas->drawColor(defaultColor); canvas->drawColor(defaultColor);
@ -746,11 +750,7 @@ JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_genera
mergeRenderingContext(renderingContext, &rc); mergeRenderingContext(renderingContext, &rc);
__android_log_print(ANDROID_LOG_WARN, "net.osmand", "End Rendering image"); __android_log_print(ANDROID_LOG_WARN, "net.osmand", "End Rendering image");
// Create byte array // delete variables
jbyteArray bitmapByteArray = ienv->NewByteArray(bitmap->getSize());
ienv->SetByteArrayRegion(bitmapByteArray, 0, bitmap->getSize(), (jbyte*)bitmap->getPixels());
// delete variables
delete paint; delete paint;
delete canvas; delete canvas;
delete req; delete req;
@ -763,8 +763,7 @@ JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_genera
sprintf(debugMessage, "Result class = %p", resultClass); sprintf(debugMessage, "Result class = %p", resultClass);
__android_log_print(ANDROID_LOG_WARN, "net.osmand", debugMessage); __android_log_print(ANDROID_LOG_WARN, "net.osmand", debugMessage);
/* Get the method ID for the String(char[]) constructor */ jmethodID resultClassCtorId = ienv->GetMethodID(resultClass, "<init>", "(Ljava/nio/ByteBuffer;Ljava/lang/String;)V");
jmethodID resultClassCtorId = ienv->GetMethodID(resultClass, "<init>", "([BLjava/lang/String;)V");
sprintf(debugMessage, "Result class ctor = %p", resultClassCtorId); sprintf(debugMessage, "Result class ctor = %p", resultClassCtorId);
__android_log_print(ANDROID_LOG_WARN, "net.osmand", debugMessage); __android_log_print(ANDROID_LOG_WARN, "net.osmand", debugMessage);
@ -774,16 +773,31 @@ JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_genera
#else #else
sprintf(debugMessage, "Native ok (init %d, rendering %d) ", initObjects.getElapsedTime(), rc.nativeOperations.getElapsedTime()); sprintf(debugMessage, "Native ok (init %d, rendering %d) ", initObjects.getElapsedTime(), rc.nativeOperations.getElapsedTime());
#endif #endif
// Allocate ctor paramters
jobject bitmapBuffer = ienv->NewDirectByteBuffer(bitmapData, bitmap->getSize());
jstring message = globalEnv()->NewStringUTF(debugMessage);
/* Construct a result object */ /* Construct a result object */
jobject resultObject = ienv->NewObject(resultClass, resultClassCtorId, bitmapByteArray, globalEnv()->NewStringUTF(debugMessage)); jobject resultObject = ienv->NewObject(resultClass, resultClassCtorId, bitmapBuffer, message);
/* Free local references */
ienv->DeleteLocalRef(bitmapByteArray);
ienv->DeleteLocalRef(resultClass);
return resultObject; return resultObject;
} }
JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_releaseRenderingGenerationResults( JNIEnv* ienv, jobject obj,
jobject results) {
setGlobalEnv(ienv);
jclass resultClass = ienv->FindClass("net/osmand/plus/render/NativeOsmandLibrary$RenderingGenerationResult");
if(!resultClass)
resultClass = ienv->FindClass("net/osmand/render/NativeOsmandLibrary$RenderingGenerationResult");
jfieldID resultClass_bitmapBuffer = globalEnv()->GetFieldID(resultClass, "bitmapBuffer", "Ljava/nio/ByteBuffer;");
jobject bitmapBuffer = globalEnv()->GetObjectField(results, resultClass_bitmapBuffer);
void *buffer = ienv->GetDirectBufferAddress(bitmapBuffer);
free(buffer);
}
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -13,10 +13,14 @@ CC_LITE_SRC_FILES := \
google/protobuf/io/zero_copy_stream.cc \ google/protobuf/io/zero_copy_stream.cc \
google/protobuf/io/zero_copy_stream_impl_lite.cc google/protobuf/io/zero_copy_stream_impl_lite.cc
include $(CLEAR_VARS) include $(CLEAR_VARS)
ifneq ($(OSMAND_NEON),true)
LOCAL_MODULE := proto LOCAL_MODULE := proto
else
LOCAL_MODULE := proto_neon
LOCAL_ARM_NEON := true
endif
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
LOCAL_CPP_EXTENSION := .cc LOCAL_CPP_EXTENSION := .cc

View file

@ -2,6 +2,15 @@
LOCAL_PATH := $(call my-dir) LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ifneq ($(OSMAND_NEON),true)
LOCAL_MODULE := skia
else
LOCAL_MODULE := skia_neon
LOCAL_ARM_NEON := true
endif
ifeq ($(SKIA_LOC),) ifeq ($(SKIA_LOC),)
SKIA_LOC := . SKIA_LOC := .
endif endif
@ -9,8 +18,6 @@ ifeq ($(SKIA_ABS),)
SKIA_ABS := $(LOCAL_PATH) SKIA_ABS := $(LOCAL_PATH)
endif endif
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm LOCAL_ARM_MODE := arm
# need a flag to tell the C side when we're on devices with large memory # need a flag to tell the C side when we're on devices with large memory
@ -23,12 +30,11 @@ ifneq ($(ARCH_ARM_HAVE_VFP),true)
LOCAL_CFLAGS += -DSK_SOFTWARE_FLOAT LOCAL_CFLAGS += -DSK_SOFTWARE_FLOAT
endif endif
ifeq ($(ARCH_ARM_HAVE_NEON),true) ifeq ($(LOCAL_ARM_NEON),true)
LOCAL_CFLAGS += -D__ARM_HAVE_NEON LOCAL_CFLAGS += -D__ARM_HAVE_NEON
endif endif
LOCAL_MODULE := skia LOCAL_SRC_FILES := \
LOCAL_SRC_FILES:= \
$(SKIA_LOC)/trunk/src/core/Sk64.cpp \ $(SKIA_LOC)/trunk/src/core/Sk64.cpp \
$(SKIA_LOC)/trunk/src/core/SkAAClip.cpp \ $(SKIA_LOC)/trunk/src/core/SkAAClip.cpp \
$(SKIA_LOC)/trunk/src/core/SkAdvancedTypefaceMetrics.cpp \ $(SKIA_LOC)/trunk/src/core/SkAdvancedTypefaceMetrics.cpp \
@ -221,7 +227,7 @@ LOCAL_C_INCLUDES += \
ifeq ($(TARGET_ARCH),arm) ifeq ($(TARGET_ARCH),arm)
ifeq ($(ARCH_ARM_HAVE_NEON),true) ifeq ($(LOCAL_ARM_NEON),true)
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
$(SKIA_LOC)/trunk/src/opts/memset16_neon.S \ $(SKIA_LOC)/trunk/src/opts/memset16_neon.S \
$(SKIA_LOC)/trunk/src/opts/memset32_neon.S $(SKIA_LOC)/trunk/src/opts/memset32_neon.S
@ -247,7 +253,7 @@ LOCAL_SHARED_LIBRARIES := \
libjpeg \ libjpeg \
libutils \ libutils \
libz libz
LOCAL_STATIC_LIBRARIES := \ LOCAL_STATIC_LIBRARIES := \
libft2 \ libft2 \
libpng \ libpng \
@ -271,7 +277,7 @@ ifeq ($(NO_FALLBACK_FONT),true)
LOCAL_CFLAGS += -DNO_FALLBACK_FONT LOCAL_CFLAGS += -DNO_FALLBACK_FONT
endif endif
LOCAL_CFLAGS := \ LOCAL_CFLAGS += \
-DSK_SCALAR_IS_FLOAT \ -DSK_SCALAR_IS_FLOAT \
-DSK_CAN_USE_FLOAT \ -DSK_CAN_USE_FLOAT \
-DSK_BUILD_FOR_ANDROID \ -DSK_BUILD_FOR_ANDROID \
@ -290,136 +296,6 @@ LOCAL_LDLIBS += -lz -llog
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)
#############################################################
# Build the skia gpu (ganesh) library
#
# include $(CLEAR_VARS)
# LOCAL_ARM_MODE := arm
# ifneq ($(ARCH_ARM_HAVE_VFP),true)
# LOCAL_CFLAGS += -DSK_SOFTWARE_FLOAT
# endif
# ifeq ($(ARCH_ARM_HAVE_NEON),true)
# LOCAL_CFLAGS += -DGR_ANDROID_BUILD=1
# endif
# LOCAL_SRC_FILES:= \
# $(SKIA_LOC)/trunk/src/gpu/GrPrintf_skia.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkGLContext.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkGpuCanvas.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkGpuDevice.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkGr.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkGrFontScaler.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkGrTexturePixelRef.cpp \
# $(SKIA_LOC)/trunk/src/gpu/SkNullGLContext.cpp \
# $(SKIA_LOC)/trunk/src/gpu/android/SkNativeGLContext_android.cpp
# LOCAL_SRC_FILES += \
# $(SKIA_LOC)/trunk/src/gpu/GrAAHairLinePathRenderer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrAddPathRenderers_aahairline.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrAllocPool.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrAtlas.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrBufferAllocPool.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrClip.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrContext.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrDefaultPathRenderer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrDrawTarget.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLCreateNullInterface.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLDefaultInterface_native.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLIndexBuffer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLInterface.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLProgram.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLRenderTarget.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLSL.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLStencilBuffer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLTexture.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLUtil.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGLVertexBuffer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGpu.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGpuFactory.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGpuGL.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrGpuGLShaders.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrInOrderDrawBuffer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrMatrix.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrMemory.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrPathRendererChain.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrPathRenderer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrPathUtils.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrRectanizer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrRenderTarget.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrResource.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrResourceCache.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrStencil.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrStencilBuffer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrTesselatedPathRenderer.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrTextContext.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrTextStrike.cpp \
# $(SKIA_LOC)/trunk/src/gpu/GrTexture.cpp \
# $(SKIA_LOC)/trunk/src/gpu/gr_unittests.cpp \
# $(SKIA_LOC)/trunk/src/gpu/android/GrGLCreateNativeInterface_android.cpp
# LOCAL_STATIC_LIBRARIES := libskiatess
# LOCAL_SHARED_LIBRARIES := \
# libcutils \
# libutils \
# libskia \
# libEGL \
# libGLESv2
# LOCAL_C_INCLUDES += \
# $(SKIA_ABS)/trunk/include/core \
# $(SKIA_ABS)/trunk/include/config \
# $(SKIA_ABS)/trunk/include/gpu \
# $(SKIA_ABS)/trunk/src/core \
# $(SKIA_ABS)/trunk/src/gpu \
# $(SKIA_ABS)/trunk/third_party/glu
# LOCAL_MODULE := libskiagpu
# LOCAL_MODULE_TAGS := optional
# include $(BUILD_STATIC_LIBRARY)
# #############################################################
# # Build the skia gpu (ganesh) library
# #
# include $(CLEAR_VARS)
# LOCAL_ARM_MODE := arm
# LOCAL_SRC_FILES := \
# third_party/glu/libtess/dict.c \
# third_party/glu/libtess/geom.c \
# third_party/glu/libtess/memalloc.c \
# third_party/glu/libtess/mesh.c \
# third_party/glu/libtess/normal.c \
# third_party/glu/libtess/priorityq.c \
# third_party/glu/libtess/render.c \
# third_party/glu/libtess/sweep.c \
# third_party/glu/libtess/tess.c \
# third_party/glu/libtess/tessmono.c
# LOCAL_SHARED_LIBRARIES := \
# libcutils \
# libutils \
# libEGL \
# libGLESv2
# LOCAL_C_INCLUDES += \
# $(LOCAL_PATH)/third_party/glu \
# $(LOCAL_PATH)/third_party/glu/libtess \
# frameworks/base/opengl/include
# LOCAL_LDLIBS += -lpthread
# LOCAL_MODULE:= libskiatess
# LOCAL_MODULE_TAGS := optional
# include $(BUILD_STATIC_LIBRARY)
# Fix some errors # Fix some errors
BUILD_HOST_EXECUTABLE := $(LOCAL_PATH)/FakeHost.mk BUILD_HOST_EXECUTABLE := $(LOCAL_PATH)/FakeHost.mk
BUILD_HOST_STATIC_LIBRARY := $(LOCAL_PATH)/FakeHost.mk BUILD_HOST_STATIC_LIBRARY := $(LOCAL_PATH)/FakeHost.mk

View file

@ -1,12 +1,14 @@
package net.osmand.plus.render; package net.osmand.plus.render;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import java.nio.ByteBuffer;
import net.osmand.LogUtil; import net.osmand.LogUtil;
import net.osmand.plus.render.OsmandRenderer.RenderingContext; import net.osmand.plus.render.OsmandRenderer.RenderingContext;
import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRuleSearchRequest;
import net.osmand.render.RenderingRulesStorage; import net.osmand.render.RenderingRulesStorage;
import android.graphics.Bitmap; import android.graphics.Bitmap;
public class NativeOsmandLibrary { public class NativeOsmandLibrary {
@ -22,8 +24,15 @@ public class NativeOsmandLibrary {
try { try {
log.debug("Loading native stlport_shared..."); //$NON-NLS-1$ log.debug("Loading native stlport_shared..."); //$NON-NLS-1$
System.loadLibrary("stlport_shared"); System.loadLibrary("stlport_shared");
log.debug("Loading native osmand..."); //$NON-NLS-1$ log.debug("Loading native cpufeatures_proxy..."); //$NON-NLS-1$
System.loadLibrary("osmand"); System.loadLibrary("cpufeatures_proxy");
if(!cpuHasNeonSupport()) {
log.debug("Loading native osmand..."); //$NON-NLS-1$
System.loadLibrary("osmand");
} else {
log.debug("Loading native osmand with NEON..."); //$NON-NLS-1$
System.loadLibrary("osmand_neon");
}
log.debug("Creating NativeOsmandLibrary instance..."); //$NON-NLS-1$ log.debug("Creating NativeOsmandLibrary instance..."); //$NON-NLS-1$
library = new NativeOsmandLibrary(); library = new NativeOsmandLibrary();
log.debug("Initializing rendering rules storage..."); //$NON-NLS-1$ log.debug("Initializing rendering rules storage..."); //$NON-NLS-1$
@ -34,7 +43,6 @@ public class NativeOsmandLibrary {
log.error("Failed to load native library", e); //$NON-NLS-1$ log.error("Failed to load native library", e); //$NON-NLS-1$
isNativeSupported = false; isNativeSupported = false;
} }
} }
} }
} }
@ -115,12 +123,12 @@ public class NativeOsmandLibrary {
} }
public static class RenderingGenerationResult { public static class RenderingGenerationResult {
public RenderingGenerationResult(byte[] bitmap, String msg) { public RenderingGenerationResult(ByteBuffer bitmap, String msg) {
bitmapArray = bitmap; bitmapBuffer = bitmap;
debugMessage = msg; debugMessage = msg;
} }
public final byte[] bitmapArray; public final ByteBuffer bitmapBuffer;
public final String debugMessage; public final String debugMessage;
} }
@ -129,12 +137,16 @@ public class NativeOsmandLibrary {
private static native boolean initBinaryMapFile(String filePath); private static native boolean initBinaryMapFile(String filePath);
private static native boolean initRenderingRulesStorage(RenderingRulesStorage storage); private static native void initRenderingRulesStorage(RenderingRulesStorage storage);
private static native RenderingGenerationResult generateRendering(RenderingContext rc, int searchResultHandler, private static native RenderingGenerationResult generateRendering(RenderingContext rc, int searchResultHandler,
int requestedBitmapWidth, int requestedBitmapHeight, boolean isTransparent, boolean useEnglishNames, int requestedBitmapWidth, int requestedBitmapHeight, boolean isTransparent, boolean useEnglishNames,
RenderingRuleSearchRequest render, int defaultColor); RenderingRuleSearchRequest render, int defaultColor);
public static native void releaseRenderingGenerationResults(RenderingGenerationResult results);
private static native int searchObjectsForRendering(int sleft, int sright, int stop, int sbottom, int zoom, String mapnaem, private static native int searchObjectsForRendering(int sleft, int sright, int stop, int sbottom, int zoom, String mapnaem,
RenderingRuleSearchRequest request, boolean skipDuplicates, int searchResultHandler, Object objectWithInterruptedField); RenderingRuleSearchRequest request, boolean skipDuplicates, int searchResultHandler, Object objectWithInterruptedField);
public static native int getCpuCount();
public static native boolean cpuHasNeonSupport();
} }

View file

@ -225,9 +225,9 @@ public class OsmandRenderer {
+ "(%s points, %s points inside, %s of %s objects visible)\n" + res.debugMessage,//$NON-NLS-1$ + "(%s points, %s points inside, %s of %s objects visible)\n" + res.debugMessage,//$NON-NLS-1$
time, rc.textRenderingTime, rc.pointCount, rc.pointInsideCount, rc.visible, rc.allObjects); time, rc.textRenderingTime, rc.pointCount, rc.pointInsideCount, rc.visible, rc.allObjects);
if(res.bitmapArray != null) { if(res.bitmapBuffer != null) {
final ByteBuffer bitmapByteBuffer = ByteBuffer.wrap(res.bitmapArray); bmp.copyPixelsFromBuffer(res.bitmapBuffer);
bmp.copyPixelsFromBuffer(bitmapByteBuffer); NativeOsmandLibrary.releaseRenderingGenerationResults(res);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();