// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Java ME Embedded and Java Card Application Technology Trail
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Java ME Embedded and Java Card Application Technology Trail - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Java ME Embedded and Java Card Application Technology Trail


== What is a Mobile Application? 

Most mobile applications use the Java Micro Edition (Java ME) platform, which was developed for small devices like mobile phones, but is now used on a wide variety of devices. Java ME uses scaled down subsets of Java SE components, virtual machines and APIs. It also defines APIs that are specifically targeted at consumer mobile and embedded devices. NetBeans IDE supports link:http://www.oracle.com/us/technologies/java/embedded/micro-edition/overview/index.html[+Oracle Java ME Embedded+] and link:http://www.oracle.com/technetwork/java/javame/javacard/overview/getstarted/index.html[+Java Card platform+].

== Getting Started

* link:../docs/javame/imp-ng.html[+Creating, Debugging, and Profiling a Mobile Embedded Application+]
* link:../docs/javame/java-card.html[+NetBeans Java Card Development Quick Start Guide+]

== Tutorials and Articles

=== Developing Java Card Applications

* link:../docs/javame/javacard.html[+Java Card Quick Start Article+]
* link:http://www.oracle.com/technetwork/articles/javase/javacard-servlets-136657.html[+Deploying Servlets on Smart Cards: Portable Web Servers with Java Card 3.0+]

== Screencasts

* link:../docs/javame/nb_me8_screencast.html[+Demo: NetBeans IDE Support for Java ME 8+]
* link:../docs/javame/nb_me_plugins_screencast.html[+Demo: Installing and Using Java ME SDK 8.0 Plugins in NetBeans IDE+]
* YouTube: link:http://youtu.be/_1PPSt2AwpM[+ Introduction into Java Micro Edition (ME) 8+] (_by Terrence Bar_)

== Community-Contributed Docs

* link:http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=11194[+Installing the Blackberry RIM Plugin for NetBeans IDE+]
* link:http://nbandroid.org/wiki/index.php/Installation[+How to Install the Android Plugin into NetBeans+]

== Other Resources

* link:http://wiki.netbeans.org/JavaMESDKSupport[+NetBeans wiki page on Java ME SDK Support+]
* link:http://docs.oracle.com/javame/config/cldc/rel/8/rpi/html/getstart_rpi/debugging.htm#sthref31[+ Using NetBeans with the Raspberry Pi Board+] in _Oracle® Java ME Embedded Getting Started Guide for the Reference Platform (Raspberry Pi) Release 8 EA 2_
* link:http://docs.oracle.com/javame/config/cldc/rel/3.3/win/gs/html/getstart_win32/setup_nbenv.htm[+ Using the Oracle Java ME SDK Software with NetBeans+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG1552[+ Developing Java ME Applications+] in _Developing Applications with NetBeans IDE_

=== NetBeans Mobility Community Resources

* link:http://wiki.netbeans.org/NetBeansUserFAQ#Java_ME.2FMobility[+NetBeans Mobility FAQs+]
* link:http://forums.netbeans.org/javame-users.html[+NetBeans Java ME User Forum+]

=== Java ME Related Sites

* link:http://www.oracle.com/technetwork/java/embedded/resources/me-embeddocs/index.html[+Java ME Embedded Documentation+]
* link:http://www.oracle.com/technetwork/java/javame/index.html[+Oracle Technology Network - Java ME Landing Page+]
