protected synchronized void unPackNatives() {

      //first check to see if we have already unpack any native libs
      if (natives_unpacked_flag) return;
      if (execDesc == null) {
         return;
      }

      NativeLibDesc nativeLibs[] = execDesc.getNativeLibs();

      //download all native libs
      boolean foundLib = false;
      List<URL> libsForOS = new ArrayList<URL>();
      for (NativeLibDesc nativeLib : nativeLibs) {
         if (nativeLib.getOS() != null && nativeLib.getOS().equals(NativeLibDesc.currentOS())) {
            libsForOS.add(nativeLib.getPath());
            foundLib = true;
         }
      }

      //if no libs found for this OS then just return
      if (!foundLib) return;

      List<CacheResource> resources = new ArrayList<CacheResource>();
      for (URL url : libsForOS) {
         resources.add(new CacheResource(url));
      }

      //download all the jars for this OS
      CacheManager cm = Boot.getCacheManager();
      cm.downloadResources(this.getExecutableDesc(), resources, cm.getDefaultListener(), true);

      //Unpack each jar
      for (CacheResource resource : resources) {
         unpackNativeJar(resource.getUrl());
      }

      natives_unpacked_flag = true;
   }