From 894e669a9500bf1cae604c8bc7d3d93761865720 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 11 May 2012 00:35:08 +0200 Subject: [PATCH] Implement simple UI for offline rendering --- .../src/net/osmand/RenderingContext.java | 9 ++- .../osmand/swing/DataExtractionSettings.java | 70 +++++++++---------- .../src/net/osmand/swing/MapClusterLayer.java | 3 +- .../src/net/osmand/swing/MapPanel.java | 9 ++- .../src/net/osmand/swing/MapRouterLayer.java | 3 +- .../osmand/swing/NativePreferencesDialog.java | 55 ++++----------- .../osmand/swing/NativeSwingRendering.java | 45 ++++++------ .../swing/OsmExtractionPreferencesDialog.java | 69 +++++++++++++++--- .../src/net/osmand/swing/OsmExtractionUI.java | 33 ++++++++- Osmand-kernel/osmand/Common.mk | 1 + Osmand-kernel/osmand/Makefile | 15 ++-- Osmand-kernel/osmand/src/java_wrap.cpp | 34 ++++++++- Osmand-kernel/png/Android.mk | 1 - 13 files changed, 218 insertions(+), 129 deletions(-) diff --git a/DataExtractionOSM/src/net/osmand/RenderingContext.java b/DataExtractionOSM/src/net/osmand/RenderingContext.java index 62542d9eed..7999b80117 100644 --- a/DataExtractionOSM/src/net/osmand/RenderingContext.java +++ b/DataExtractionOSM/src/net/osmand/RenderingContext.java @@ -4,6 +4,8 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public class RenderingContext { static enum ShadowRenderingMode { @@ -71,11 +73,13 @@ public class RenderingContext { return val * density; } + private Map precache = new HashMap(); + protected byte[] getIconRawData(String data) { if(iconsBaseDir != null) { - File fs = new File(iconsBaseDir+"/h_"+data+".png"); + File fs = new File(iconsBaseDir.getAbsolutePath()+"/h_"+data+".png"); if(!fs.exists()) { - fs = new File(iconsBaseDir+"/g_"+data+".png"); + fs = new File(iconsBaseDir.getAbsolutePath()+"/g_"+data+".png"); } if (fs.exists()) { try { @@ -84,6 +88,7 @@ public class RenderingContext { int l = fis.read(dta); fis.close(); if (l == dta.length) { + precache.put(data, dta); return dta; } else { System.err.println("Read data " + l + " however was expected " + dta.length + " for " + data); diff --git a/DataExtractionOSM/src/net/osmand/swing/DataExtractionSettings.java b/DataExtractionOSM/src/net/osmand/swing/DataExtractionSettings.java index b37aacc62b..d19d5ffd60 100644 --- a/DataExtractionOSM/src/net/osmand/swing/DataExtractionSettings.java +++ b/DataExtractionOSM/src/net/osmand/swing/DataExtractionSettings.java @@ -42,41 +42,6 @@ public class DataExtractionSettings { preferences.put("working_dir", path.getAbsolutePath()); } - - public File[] getDefaultRoutingFile(){ - String routingFile = preferences.get("routing_file", null); - if(routingFile == null){ - return null; - } - String[] files = routingFile.split(","); - List fs = new ArrayList(); - for(String f : files){ - if(new File(f.trim()).exists()){ - fs.add(new File(f.trim())); - } - } - - return fs.toArray(new File[fs.size()]); - } - - public String getDefaultRoutingFilePath(){ - File[] file = getDefaultRoutingFile(); - String path = ""; - if (file != null) { - for (int i = 0; i < file.length; i++) { - if (i > 0) { - path += ", "; - } - path += file[i].getAbsolutePath(); - } - } - return path; - } - - public void setDefaultRoutingPath(String path){ - preferences.put("routing_file", path); - } - public LatLon getDefaultLocation(){ double lat = preferences.getDouble("default_lat", 53.9); double lon = preferences.getDouble("default_lon", 27.56); @@ -172,6 +137,41 @@ public class DataExtractionSettings { preferences.put("cityAdminLevel", s); } + public String getNativeLibFile(){ + String fl = preferences.get("nativeLibFile", null); + if(fl != null) { + return fl; + } + return getDefaultWorkingDir().getAbsolutePath() +"/osmand.lib"; + } + + public void setNativeLibFile(String file){ + preferences.put("nativeLibFile", file); + } + + public String getRenderXmlPath(){ + return preferences.get("renderXmlPath", "default.render.xml"); + } + + public void setRenderXmlPath(String file){ + preferences.put("renderXmlPath", file); + } + + + + public String getBinaryFilesDir(){ + String fl = preferences.get("binaryFilesDir", null); + if(fl != null) { + return fl; + } + return getDefaultWorkingDir().getAbsolutePath(); + } + + public void setBinaryFilesDir(String file){ + preferences.put("binaryFilesDir", file); + } + + public String getOsrmServerAddress(){ return preferences.get("osrmServerAddress", "http://127.0.0.1:5000"); } diff --git a/DataExtractionOSM/src/net/osmand/swing/MapClusterLayer.java b/DataExtractionOSM/src/net/osmand/swing/MapClusterLayer.java index 95c0954f30..9f14b111ce 100644 --- a/DataExtractionOSM/src/net/osmand/swing/MapClusterLayer.java +++ b/DataExtractionOSM/src/net/osmand/swing/MapClusterLayer.java @@ -123,7 +123,8 @@ public class MapClusterLayer implements MapPanelLayer { private List clustering(double lat, double lon, Set roads) throws IOException{ List res = new ArrayList(); - File[] files = DataExtractionSettings.getSettings().getDefaultRoutingFile(); + //TODO DataExtractionSettings.getSettings().getBinaryFilesDir() + File[] files = new File[0]; BinaryMapIndexReader[] rs = new BinaryMapIndexReader[files.length]; for(int i=0; i selfRoute(LatLon start, LatLon end) { List res = new ArrayList(); long time = System.currentTimeMillis(); - File[] files = DataExtractionSettings.getSettings().getDefaultRoutingFile(); + // TODO DataExtractionSettings.getSettings().getBinaryFilesDir() + File[] files = new File[0]; if(files == null){ JOptionPane.showMessageDialog(OsmExtractionUI.MAIN_APP.getFrame(), "Please specify obf file in settings", "Obf file not found", JOptionPane.ERROR_MESSAGE); diff --git a/DataExtractionOSM/src/net/osmand/swing/NativePreferencesDialog.java b/DataExtractionOSM/src/net/osmand/swing/NativePreferencesDialog.java index 2bfb1a338d..f85ca344b4 100644 --- a/DataExtractionOSM/src/net/osmand/swing/NativePreferencesDialog.java +++ b/DataExtractionOSM/src/net/osmand/swing/NativePreferencesDialog.java @@ -30,7 +30,7 @@ public class NativePreferencesDialog extends JDialog { private JTextField nativeFilesDirectory; private JTextField renderingStyleFile; - private JTextField nativeLibFile; + private boolean okPressed; public NativePreferencesDialog(Component parent){ @@ -89,7 +89,7 @@ public class NativePreferencesDialog extends JDialog { nativeFilesDirectory = new JTextField(); - nativeFilesDirectory.setText(DataExtractionSettings.getSettings().getDefaultWorkingDir().getAbsolutePath()); + nativeFilesDirectory.setText(DataExtractionSettings.getSettings().getBinaryFilesDir()); panel.add(nativeFilesDirectory); constr = new GridBagConstraints(); constr.weightx = 1; @@ -99,27 +99,6 @@ public class NativePreferencesDialog extends JDialog { constr.gridy = 1; l.setConstraints(nativeFilesDirectory, constr); - - label = new JLabel("City admin level : "); - panel.add(label); - constr = new GridBagConstraints(); - constr.ipadx = 5; - constr.gridx = 0; - constr.gridy = 2; - constr.anchor = GridBagConstraints.WEST; - l.setConstraints(label, constr); - - nativeLibFile = new JTextField(); - - nativeLibFile.setText(DataExtractionSettings.getSettings().getCityAdminLevel()); - panel.add(nativeLibFile); - constr = new GridBagConstraints(); - constr.weightx = 1; - constr.fill = GridBagConstraints.HORIZONTAL; - constr.ipadx = 5; - constr.gridx = 1; - constr.gridy = 2; - l.setConstraints(nativeLibFile, constr); label = new JLabel("Rendering style file : "); panel.add(label); @@ -131,7 +110,7 @@ public class NativePreferencesDialog extends JDialog { l.setConstraints(label, constr); renderingStyleFile = new JTextField(); - renderingStyleFile.setText(DataExtractionSettings.getSettings().getOsrmServerAddress()); + renderingStyleFile.setText(DataExtractionSettings.getSettings().getRenderXmlPath()); panel.add(renderingStyleFile); constr = new GridBagConstraints(); constr.weightx = 1; @@ -151,6 +130,7 @@ public class NativePreferencesDialog extends JDialog { @Override public void actionPerformed(ActionEvent e) { saveProperties(); + okPressed = true; setVisible(false); } @@ -166,25 +146,20 @@ public class NativePreferencesDialog extends JDialog { public void saveProperties(){ - // TODO -// DataExtractionSettings settings = DataExtractionSettings.getSettings(); -// if(!settings.getSuffixesToNormalizeStreetsString().equals(streetSuffixes.getText())){ -// settings.setSuffixesToNormalizeStreets(streetSuffixes.getText()); -// } -// if(!settings.getDefaultSuffixesToNormalizeStreetsString().equals(streetDefaultSuffixes.getText())){ -// settings.setDefaultSuffixesToNormalizeStreets(streetDefaultSuffixes.getText()); -// } -// if(settings.useInternetToLoadImages() != useInternet.isSelected()){ -// settings.setUseInterentToLoadImages(useInternet.isSelected()); -// } -// -// if(!settings.getLineSmoothness().equals(lineSmoothness.getText())){ -// settings.setLineSmoothness(lineSmoothness.getText()); -// } + DataExtractionSettings settings = DataExtractionSettings.getSettings(); + if(!settings.getBinaryFilesDir().equals(nativeFilesDirectory.getText())){ + settings.setBinaryFilesDir(nativeFilesDirectory.getText()); + } + + if(!settings.getRenderXmlPath().equals(renderingStyleFile.getText())){ + settings.setRenderXmlPath(renderingStyleFile.getText()); + } } - + public boolean isOkPressed() { + return okPressed; + } } diff --git a/DataExtractionOSM/src/net/osmand/swing/NativeSwingRendering.java b/DataExtractionOSM/src/net/osmand/swing/NativeSwingRendering.java index 1e20a91e63..619012eaf1 100644 --- a/DataExtractionOSM/src/net/osmand/swing/NativeSwingRendering.java +++ b/DataExtractionOSM/src/net/osmand/swing/NativeSwingRendering.java @@ -2,6 +2,7 @@ package net.osmand.swing; import java.awt.image.BufferedImage; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; @@ -21,14 +22,10 @@ import net.osmand.render.RenderingRulesStorage.RenderingRulesStorageResolver; public class NativeSwingRendering extends NativeLibrary { - static { -// System.load("/home/victor/projects/OsmAnd/git/Osmand-kernel/jni-prebuilt/linux-x86/osmand.lib"); - } - RenderingRulesStorage storage; private final File baseDirRC; - private RenderingRulesStorage getDefault() throws SAXException, IOException{ + public void loadRuleStorage(String path) throws SAXException, IOException{ RenderingRulesStorage storage = new RenderingRulesStorage(); final RenderingRulesStorageResolver resolver = new RenderingRulesStorageResolver() { @Override @@ -43,14 +40,18 @@ public class NativeSwingRendering extends NativeLibrary { return depends; } }; - storage.parseRulesFromXmlInputStream(RenderingRulesStorage.class.getResourceAsStream("default.render.xml"), resolver); - return storage; + if(path == null || path.equals("default.render.xml")) { + storage.parseRulesFromXmlInputStream(RenderingRulesStorage.class.getResourceAsStream("default.render.xml"), resolver); + } else { + storage.parseRulesFromXmlInputStream(new FileInputStream(path), resolver); + } + this.storage = storage; } public NativeSwingRendering(File baseDirRC){ this.baseDirRC = baseDirRC; try { - storage = getDefault(); + loadRuleStorage(null); } catch (SAXException e) { throw new RuntimeException(e); } catch (IOException e) { @@ -60,6 +61,7 @@ public class NativeSwingRendering extends NativeLibrary { + public BufferedImage renderImage(int sleft, int sright, int stop, int sbottom, int zoom) throws IOException { long time = -System.currentTimeMillis(); RenderingContext rctx = new RenderingContext(baseDirRC); @@ -111,26 +113,19 @@ public class NativeSwingRendering extends NativeLibrary { } } + private static NativeSwingRendering loaded = null; + public static NativeSwingRendering loadLibrary(String path){ + if(loaded == null) { + System.load(path); + // TODO images !!! + loaded = new NativeSwingRendering(new File("/home/victor/projects/OsmAnd/git/OsmAnd/res/drawable-mdpi/")); + } + return loaded; + } public static void main(String[] args) throws SAXException, IOException { - System.load("/home/victor/projects/OsmAnd/git/Osmand-kernel/jni-prebuilt/linux-x86/osmand.lib"); - NativeSwingRendering lib = new NativeSwingRendering( - new File("/home/victor/projects/OsmAnd/git/OsmAnd/res/drawable-mdpi/")); + NativeSwingRendering lib = loadLibrary("/home/victor/projects/OsmAnd/git/Osmand-kernel/jni-prebuilt/linux-x86/osmand.lib"); lib.initFilesInDir(new File("/home/victor/projects/OsmAnd/data/version2")); - double latTop = 22.5; - double lonLeft = -80; - int zoom = 11; - - float tileX = 2; - float tileY = 2; - double latBottom = MapUtils.getLatitudeFromTile(zoom, MapUtils.getTileNumberY(zoom, latTop) + tileY); - double lonRight = MapUtils.getLongitudeFromTile(zoom, MapUtils.getTileNumberX(zoom, lonLeft) + tileX); - int sleft = MapUtils.get31TileNumberX(lonLeft); - int sright = MapUtils.get31TileNumberX(lonRight); - int stop = MapUtils.get31TileNumberY(latTop); - int sbottom = MapUtils.get31TileNumberY(latBottom); - lib.renderImage(sleft, sright, stop, sbottom, zoom); - MapPanel.showMainWindow(512, 512, lib); } } diff --git a/DataExtractionOSM/src/net/osmand/swing/OsmExtractionPreferencesDialog.java b/DataExtractionOSM/src/net/osmand/swing/OsmExtractionPreferencesDialog.java index e5ba2c5079..6dcad52cae 100644 --- a/DataExtractionOSM/src/net/osmand/swing/OsmExtractionPreferencesDialog.java +++ b/DataExtractionOSM/src/net/osmand/swing/OsmExtractionPreferencesDialog.java @@ -35,7 +35,9 @@ public class OsmExtractionPreferencesDialog extends JDialog { private JTextField cityAdminLevel; private JTextField osrmServerAddress; private JTextField renderingTypesFile; - private JTextField pathToObfRoutingFile; + private JTextField nativeLibFile; + private JTextField nativeFilesDirectory; + private JTextField renderingStyleFile; private JCheckBox useInternet; @@ -51,7 +53,7 @@ public class OsmExtractionPreferencesDialog extends JDialog { } public void showDialog(){ - setSize(700, 380); + setSize(700, 500); double x = getParent().getBounds().getCenterX(); double y = getParent().getBounds().getCenterY(); setLocation((int) x - getWidth() / 2, (int) y - getHeight() / 2); @@ -102,7 +104,7 @@ public class OsmExtractionPreferencesDialog extends JDialog { constr.anchor = GridBagConstraints.WEST; l.setConstraints(useInternet, constr); - JLabel label = new JLabel("Path to obf files (test routing, comma separated) : "); + JLabel label = new JLabel("Directory with obf binary files (routing, rendering): "); panel.add(label); constr = new GridBagConstraints(); constr.ipadx = 5; @@ -111,17 +113,17 @@ public class OsmExtractionPreferencesDialog extends JDialog { constr.anchor = GridBagConstraints.WEST; l.setConstraints(label, constr); - pathToObfRoutingFile = new JTextField(); + nativeFilesDirectory = new JTextField(); - pathToObfRoutingFile.setText(DataExtractionSettings.getSettings().getDefaultRoutingFilePath()); - panel.add(pathToObfRoutingFile); + nativeFilesDirectory.setText(DataExtractionSettings.getSettings().getBinaryFilesDir()); + panel.add(nativeFilesDirectory); constr = new GridBagConstraints(); constr.weightx = 1; constr.fill = GridBagConstraints.HORIZONTAL; constr.ipadx = 5; constr.gridx = 1; constr.gridy = 1; - l.setConstraints(pathToObfRoutingFile, constr); + l.setConstraints(nativeFilesDirectory, constr); label = new JLabel("City admin level : "); @@ -165,6 +167,46 @@ public class OsmExtractionPreferencesDialog extends JDialog { constr.gridx = 1; constr.gridy = 3; l.setConstraints(osrmServerAddress, constr); + + label = new JLabel("Rendering style file : "); + panel.add(label); + constr = new GridBagConstraints(); + constr.ipadx = 5; + constr.gridx = 0; + constr.gridy = 4; + constr.anchor = GridBagConstraints.WEST; + l.setConstraints(label, constr); + + renderingStyleFile = new JTextField(); + renderingStyleFile.setText(DataExtractionSettings.getSettings().getRenderXmlPath()); + panel.add(renderingStyleFile); + constr = new GridBagConstraints(); + constr.weightx = 1; + constr.fill = GridBagConstraints.HORIZONTAL; + constr.ipadx = 5; + constr.gridx = 1; + constr.gridy = 4; + l.setConstraints(renderingStyleFile, constr); + + label = new JLabel("Native lib file (osmand.lib): "); + panel.add(label); + constr = new GridBagConstraints(); + constr.ipadx = 5; + constr.gridx = 0; + constr.gridy = 5; + constr.anchor = GridBagConstraints.WEST; + l.setConstraints(label, constr); + + nativeLibFile = new JTextField(); + nativeLibFile.setText(DataExtractionSettings.getSettings().getNativeLibFile()); + panel.add(nativeLibFile); + constr = new GridBagConstraints(); + constr.weightx = 1; + constr.fill = GridBagConstraints.HORIZONTAL; + constr.ipadx = 5; + constr.gridx = 1; + constr.gridy = 5; + l.setConstraints(nativeLibFile, constr); // supressWarning = new JCheckBox(); // supressWarning.setText(Messages.getString("OsmExtractionPreferencesDialog.DUPLICATED.ID")); //$NON-NLS-1$ @@ -320,6 +362,9 @@ public class OsmExtractionPreferencesDialog extends JDialog { if(settings.useInternetToLoadImages() != useInternet.isSelected()){ settings.setUseInterentToLoadImages(useInternet.isSelected()); } + if(!settings.getNativeLibFile().equals(nativeLibFile.getText())){ + settings.setNativeLibFile(nativeLibFile.getText()); + } if(!settings.getLineSmoothness().equals(lineSmoothness.getText())){ settings.setLineSmoothness(lineSmoothness.getText()); @@ -330,15 +375,19 @@ public class OsmExtractionPreferencesDialog extends JDialog { if(!settings.getMapRenderingTypesFile().equals(renderingTypesFile.getText())){ settings.setMapRenderingTypesFile(renderingTypesFile.getText()); } - if(!settings.getDefaultRoutingFilePath().equals(pathToObfRoutingFile.getText())){ - settings.setDefaultRoutingPath(pathToObfRoutingFile.getText()); - } if(!settings.getCityAdminLevel().equals(cityAdminLevel.getText())){ settings.setCityAdminLevel(cityAdminLevel.getText()); } if(!settings.getOsrmServerAddress().equals(osrmServerAddress.getText())){ settings.setOsrmServerAddress(osrmServerAddress.getText()); } + if(!settings.getBinaryFilesDir().equals(nativeFilesDirectory.getText())){ + settings.setBinaryFilesDir(nativeFilesDirectory.getText()); + } + + if(!settings.getRenderXmlPath().equals(renderingStyleFile.getText())){ + settings.setRenderXmlPath(renderingStyleFile.getText()); + } // if(settings.isSupressWarningsForDuplicatedId() != supressWarning.isSelected()){ // settings.setSupressWarningsForDuplicatedId (supressWarning.isSelected()); // } diff --git a/DataExtractionOSM/src/net/osmand/swing/OsmExtractionUI.java b/DataExtractionOSM/src/net/osmand/swing/OsmExtractionUI.java index cbbe2e0abc..fca9271d51 100644 --- a/DataExtractionOSM/src/net/osmand/swing/OsmExtractionUI.java +++ b/DataExtractionOSM/src/net/osmand/swing/OsmExtractionUI.java @@ -218,11 +218,38 @@ public class OsmExtractionUI implements IMapLocationListener { showOfflineIndex.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - NativePreferencesDialog dlg = new NativePreferencesDialog(frame); - dlg.showDialog(); + if(showOfflineIndex.isSelected()) { + NativePreferencesDialog dlg = new NativePreferencesDialog(frame); + dlg.showDialog(); + if(dlg.isOkPressed()) { + initNativeRendering(); + } else { + showOfflineIndex.setSelected(false); + } + } else { + mapPanel.setNativeLibrary(null); + } } }); - + } + + private void initNativeRendering() { + NativeSwingRendering lib = NativeSwingRendering.loadLibrary( + DataExtractionSettings.getSettings().getNativeLibFile()); + if(lib != null) { + try { + lib.initFilesInDir(new File(DataExtractionSettings.getSettings().getBinaryFilesDir())); + lib.loadRuleStorage(DataExtractionSettings.getSettings().getRenderXmlPath()); + mapPanel.setNativeLibrary(lib); + mapPanel.repaint(); + } catch (SAXException e) { + log.error(e.getMessage(), e); + throw new RuntimeException(e); + } catch (IOException e) { + log.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } } public void fillMenuWithActions(final JMenuBar bar){ diff --git a/Osmand-kernel/osmand/Common.mk b/Osmand-kernel/osmand/Common.mk index eda74864b9..87e4018f04 100644 --- a/Osmand-kernel/osmand/Common.mk +++ b/Osmand-kernel/osmand/Common.mk @@ -5,6 +5,7 @@ OSMAND_SKIA_ABS := $(LOCAL_PATH)/../skia/skia_library LOCAL_C_INCLUDES := $(LOCAL_PATH)/src \ $(PROTOBUF) \ $(LOCAL_PATH)/../skia \ + $(LOCAL_PATH)/../expat/expat_library/lib \ $(OSMAND_SKIA_ABS)/include/core \ $(OSMAND_SKIA_ABS)/include/images \ $(OSMAND_SKIA_ABS)/include/utils \ diff --git a/Osmand-kernel/osmand/Makefile b/Osmand-kernel/osmand/Makefile index d02b139f89..01becd583b 100644 --- a/Osmand-kernel/osmand/Makefile +++ b/Osmand-kernel/osmand/Makefile @@ -6,10 +6,12 @@ include ./Common.mk LOCAL_SRC_FILES += src/osmand_main.cpp -LDFLAGS = -Wl,--hash-style=both -shared +#LDFLAGS = -Wl,--hash-style=both -fPIC +LDFLAGS = -Wall -fPIC -Wl,-Bsymbolic LDRUNFLAGS = -Wl,--hash-style=both +# --trace -Bsymbolic -Bsymbolic-functions -LDLIBS = -L$(PREBUILT_DIR) -lskia -lproto -lpthread -lrt -lft2 -lexpat -lpng -lz +LDLIBS = -L$(PREBUILT_DIR) -lskia -lproto -lpthread -lrt -lft2 -lexpat -lz -lpng CPP_FILE_EXTENSION = cpp OBJECTS = $(LOCAL_SRC_FILES:src/%.$(CPP_FILE_EXTENSION)=build/obj/%.o) @@ -29,17 +31,16 @@ target : $(PREBUILT_DIR)/$(LIBNAME) #target : $(PREBUILT_DIR)/$(LIBNAME) ../$(RUNFILE) -../$(RUNFILE) : $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a +../$(RUNFILE) : $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a Makefile $(CXX) $(LDRUNFLAGS) -o ../$(RUNFILE) $(OBJECTS) $(LDLIBS) @chmod +x ../$(RUNFILE) -$(PREBUILT_DIR)/$(LIBNAME) : build/$(LIBNAME) +$(PREBUILT_DIR)/$(LIBNAME) : build/$(LIBNAME) cp build/$(LIBNAME) $(PREBUILT_DIR)/$(LIBNAME) -build/$(LIBNAME): $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a - $(CXX) $(LDFLAGS) -o build/$(LIBNAME) $(OBJECTS) $(LDLIBS) - strip build/$(LIBNAME) +build/$(LIBNAME): $(OBJECTS) $(PREBUILT_DIR)/libskia.a $(PREBUILT_DIR)/libproto.a Makefile + $(CXX) -shared -o build/$(LIBNAME) $(OBJECTS) $(LDFLAGS) $(LDLIBS) build/obj/%.o : src/%.$(CPP_FILE_EXTENSION) $(LOCAL_C_INCLUDES) @mkdir -p `dirname $@` diff --git a/Osmand-kernel/osmand/src/java_wrap.cpp b/Osmand-kernel/osmand/src/java_wrap.cpp index 554414a2ad..1bc6df43a0 100644 --- a/Osmand-kernel/osmand/src/java_wrap.cpp +++ b/Osmand-kernel/osmand/src/java_wrap.cpp @@ -17,6 +17,24 @@ JavaVM* globalJVM = NULL; void loadJniRenderingContext(JNIEnv* env); void loadJniRenderingRules(JNIEnv* env); + +static int simplePngSize = 93; +static void* simplePng = new uint8[simplePngSize]{ + 0x89 ,0x50 ,0x4E ,0x47 ,0x0D ,0x0A ,0x1A ,0x0A , + 0x00 ,0x00 ,0x00 ,0x0D ,0x49 ,0x48 ,0x44 ,0x52 , + 0x00 ,0x00 ,0x00 ,0x06 ,0x00 ,0x00 ,0x00 ,0x06 , + 0x08 ,0x03 ,0x00 ,0x00 ,0x00 ,0xD7 ,0x12 ,0x1F , + 0x7A ,0x00 ,0x00 ,0x00 ,0x03 ,0x50 ,0x4C ,0x54 , + 0x45 ,0x20 ,0x97 ,0xCE ,0xDD ,0xEB ,0x88 ,0x50 , + 0x00 ,0x00 ,0x00 ,0x15 ,0x49 ,0x44 ,0x41 ,0x54 , + 0x78 ,0xDA ,0x8D ,0xC1 ,0x01 ,0x01 ,0x00 ,0x00 , + 0x00 ,0x80 ,0x90 ,0xFE ,0xAF ,0x76 ,0x21 ,0xDA , + 0x00 ,0x00 ,0x2A ,0x00 ,0x01 ,0xD0 ,0x79 ,0x58 , + 0x1D ,0x00 ,0x00 ,0x00 ,0x00 ,0x49 ,0x45 ,0x4E , + 0x44 ,0xAE ,0x42 ,0x60 ,0x82 +}; + + extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv* globalJniEnv; @@ -25,8 +43,19 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) globalJVM = vm; loadJniRenderingContext(globalJniEnv); loadJniRenderingRules(globalJniEnv); - osmand_log_print(LOG_INFO, "JNI_OnLoad completed"); + // Encode and decode png (bug in PC Java linking, currently using -Bsymbolic?) + /*SkBitmap* bmp = new SkBitmap(); + if(!SkImageDecoder::DecodeMemory(simplePng, simplePngSize, bmp)) { + osmand_log_print(LOG_INFO, "Initialization jni : decode png failed!"); + return JNI_VERSION_1_6; + } + SkImageEncoder* enc = SkImageEncoder::Create(SkImageEncoder::kPNG_Type); + SkDynamicMemoryWStream* stream = new SkDynamicMemoryWStream(); + enc->encodeStream(stream, *bmp, 80); + delete stream; + delete bmp;*/ + osmand_log_print(LOG_INFO, "JNI_OnLoad completed"); return JNI_VERSION_1_6; } @@ -186,7 +215,6 @@ extern "C" JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLib RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest); JNIRenderingContext rc; pullFromJavaRenderingContext(ienv, renderingContext, &rc); - rc.setUseEnglishNames(useEnglishNames); ResultPublisher* result = ((ResultPublisher*) searchResult); // std::vector mapDataObjects = marshalObjects(binaryMapDataObjects); @@ -304,6 +332,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_net_osmand_NativeLibrary_generateRende bitmapData = malloc(bitmapDataSize); stream->copyTo(bitmapData); + delete enc; } bitmapBuffer = ienv->NewDirectByteBuffer(bitmapData, bitmapDataSize); @@ -428,7 +457,6 @@ SkBitmap* JNIRenderingContext::getCachedBitmap(const std::string& bitmapResource this->nativeOperations.start(); env->ReleaseByteArrayElements(javaIconRawData, bitmapBuffer, JNI_ABORT); env->DeleteLocalRef(javaIconRawData); - env->DeleteLocalRef(jstr); throwNewException(env, (std::string("Failed to decode ") + bitmapResource).c_str()); diff --git a/Osmand-kernel/png/Android.mk b/Osmand-kernel/png/Android.mk index 07b9fa15cd..4273574cc5 100755 --- a/Osmand-kernel/png/Android.mk +++ b/Osmand-kernel/png/Android.mk @@ -9,7 +9,6 @@ LOCAL_MODULE := png else LOCAL_MODULE := png_neon endif -LIBPNG ifneq ($(OSMAND_USE_PREBUILT),true) common_CFLAGS := -fvisibility=hidden ## -fomit-frame-pointer