Lesson 7 Collections, Generics JNI. What is the Collections framework?  Collections framework provides two things: –implementations of common high-level.

Slides:



Advertisements
Similar presentations
Transparency No. 1 Java Collection API : Built-in Data Structures for Java.
Advertisements

Lists and the Collection Interface Chapter 4. Chapter Objectives To become familiar with the List interface To understand how to write an array-based.
Collections. What is the Collections framework?  Collections framework provides two things: –implementations of common high-level data structures: e.g.
Java Native Interface Modified from CS587x Lecture Department of Computer Science Iowa State University.
Collections Sets - no duplicates Lists - duplicates allowed Maps - key / value pairs A collection is an Object which contains other Objects. There are.
Java Collections Framework COMP53 Oct 24, Collections Framework A unified architecture for representing and manipulating collections Allows collections.
June 1, 2000 Object Oriented Programming in Java (95-707) Java Language Basics 1 Lecture 7 Object Oriented Programming in Java Advanced Topics Collection.
15-Jun-15 Lists in Java Part of the Collections Framework.
Algorithm Programming Containers in Java Bar-Ilan University תשס " ו by Moshe Fresko.
What Is a Collection?  A collection (sometimes called a container) is simply an object that groups multiple elements into a single unit.  Collections.
Lists and the Collection Interface Chapter 4. Chapter 4: Lists and the Collection Interface2 Chapter Objectives To become familiar with the List interface.
24-Jun-15 Introduction to Collections. 2 Collections A collection is a structured group of objects Java 1.2 introduced the Collections Framework Collections.
Java Native Interface (JNI). JNI Linking Java and C code.
Fall 2007CS 2251 Lists and the Collection Interface Chapter 4.
Liang, Introduction to Java Programming, Sixth Edition, (c) 2007 Pearson Education, Inc. All rights reserved L15 (Chapter 22) Java Collections.
UMass Lowell Computer Science Java and Distributed Computing Prof. Karen Daniels Fall, 2000 Lecture 17 Advanced Java Concepts Data Structure Support.
Unit 291 Java Collections Framework: Interfaces Introduction to the Java Collections Framework (JCF) The Comparator Interface Revisited The Collection.
Collections The objectives of this chapter are: To outline the Collections infrastructure in Java To describe the various collection classes To discuss.
Lists in Java Part of the Collections Framework. Kinds of Collections Collection --a group of objects, called elements –Set-- An unordered collection.
12-Jul-15 Lists in Java Part of the Collections Framework.
The Collections Framework A Brief Introduction. Collections A collection is a structured group of objects –An array is a kind of collection –A Vector.
Chapter 19 Java Data Structures
Java's Collection Framework
SEG4110 – Advanced Software Design and Reengineering TOPIC G Java Collections Framework.
Sets and Maps Part of the Collections Framework. The Set interface A Set is unordered and has no duplicates Operations are exactly those for Collection.
CS2110: SW Development Methods Textbook readings: MSD, Chapter 8 (Sect. 8.1 and 8.2) But we won’t implement our own, so study the section on Java’s Map.
Data Structures and Abstract Data Types "Get your data structures correct first, and the rest of the program will write itself." - David Jones.
Liang, Introduction to Java Programming, Sixth Edition, (c) 2007 Pearson Education, Inc. All rights reserved Chapter 22 Java Collections.
Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved Chapter 22 Java Collections.
Java™ How to Program, 9/e Presented by: Dr. José M. Reyes Álamo © Copyright by Pearson Education, Inc. All Rights Reserved.
Collections in Java. Kinds of Collections Collection --a group of objects, called elements –Set-- An unordered collection with no duplicates SortedSet.
Jan 12, 2012 Introduction to Collections. 2 Collections A collection is a structured group of objects Java 1.2 introduced the Collections Framework Collections.
Java Introduction to JNI Prepared by Humaira Siddiqui.
1 Java: AP Curriculum Focus and Java Subset Alyce Brady.
Data Design and Implementation. Definitions of Java TYPES Atomic or primitive type A data type whose elements are single, non-decomposable data items.
Chapter 18 Java Collections Framework
1 TCSS 143, Autumn 2004 Lecture Notes Java Collection Framework: Maps and Sets.
1/20/03A2-1 CS494 Interfaces and Collection in Java.
Data structures and algorithms in the collection framework 1.
Collections in Java. 2 Collections Hierarchy > ArrayListVector Stack LinkedList > Arrays Collections.
1.0tCopyright © 1998 Purple Technology, Inc. 1 Java Collections Framework Authored by Alex Chaffee Copyright © 1998 Purple Technology, Inc. All rights.
The Java Collections Framework Based on
3-February-2003cse Collections © 2003 University of Washington1 Java Collections CSE 403, Winter 2003 Software Engineering
1 Collections Framework A collections framework is a unified architecture for representing and manipulating collections. All collections frameworks contain:
Collections Data structures in Java. OBJECTIVE “ WHEN TO USE WHICH DATA STRUCTURE ” D e b u g.
Collections Mrs. C. Furman April 21, Collection Classes ArrayList and LinkedList implements List HashSet implements Set TreeSet implements SortedSet.
CS Ananda Gunawardena.  A collection (sometimes called a container) is simply an object that groups multiple elements into a single unit.  Collections.
Maps Nick Mouriski.
Sets and Maps Part of the Collections Framework. 2 The Set interface A Set is unordered and has no duplicates Operations are exactly those for Collection.
CMSC 202 Containers and Iterators. Container Definition A “container” is a data structure whose purpose is to hold objects. Most languages support several.
Data Structures I Collection, List, ArrayList, LinkedList, Iterator, ListNode.
4-Mar-16 Introduction to Collections. Revision questions True false questions 0 for False 1 for True Please do not answer anything other than the above.
Collections Dwight Deugo Nesa Matic
3-1 Java's Collection Framework Another use of polymorphism and interfaces Rick Mercer.
19-Mar-16 Collections and ArrayLists.. 2 Collections Why use Collections. Collections and Object-Orientation. ArrayLists. Special Features. Creating ArrayLists.
Lecture 9:FXML and Useful Java Collections Michael Hsu CSULA.
 2016, Marcus Biel, ArrayList Marcus Biel, Software Craftsman
JNI: Java Native Interface(1/32) Real Time Systems LAB. JNI: Java Native Interface October 31, 2001 Kyung-Yim, Kim.
Java Collections CHAPTER 3-February-2003
Sixth Lecture ArrayList Abstract Class and Interface
Chapter 19 Java Data Structures
Introduction to Collections
Introduction to Collections
Introduction to Collections
Part of the Collections Framework
Collections in Java The objectives of this lecture are:
Introduction to Collections
Collections Framework
Introduction to Collections
Presentation transcript:

Lesson 7 Collections, Generics JNI

What is the Collections framework?  Collections framework provides two things: –implementations of common high-level data structures: e.g. Maps, Sets, Lists, etc. –An organized class hierarchy with rules/formality for adding new implementations  The latter point is the sense in which Collections are a framework.  Note the difference between providing a framework + implementation and just implementation.  Some other differences: –code reuse –clarity –unit testing?

Definition of colelction  A collection — sometimes called a container — is simply an object that groups multiple elements into a single unit.  Collections are used to store, retrieve, manipulate, and communicate aggregate data.  They typically represent data items that form a natural group, e.g. – poker hand (a collection of cards), a mail folder (a collection of letters), or a telephone directory (a mapping from names to phone numbers).

History  Pre Java SDK1.2, Java provided a handful of data structures: –Hashtable –Vector –Bitset  These were for the most part good and easy to use, but they were not organized into a more general framework.  SDK1.2 added the larger skeleton which organizes a much more general set of data structures.  Legacy datastructures retrofitted to new model.  Generic types/autoboxing added in 1.5

General comments about data structures  “Containers” for storing data.  Different data structures provide different abstractions for getting/setting elements of data. –linked lists –hashtables –vectors –arrays  Same data structures can even be implemented in different ways for performance/memory: –queue over linked list –queue over arrays

More on data structures  Everyone should take a basic class in building data structures  I recommend the book Mastering Algorthims with C by Kyle Loudon  In Java, one does not usually build data structures, but rather uses the provided one  Using Java’s data structures requires a little understanding of the Collections framework  Adding your own requires a deeper understanding.

Learning to use data structures  Dual purposes for us to study Collections: –Be able to choose, properly use built-in data structures. –Another study in OO class design  Thus, we start by study the Collections class design.  Then, we provide many examples of how to use the built-in types in real programming.

Collections-related Interface hierarchy Collection ListSet SortedSet Map SortedMap Iterator ListIterator The Collection inteface stores groups of Objects, with duplicates allowed The Set interface extends Collection but forbids duplicates The List interface extends Collection, allows duplicates, and introduces positional indexing. Map is a separate hierarchy

Collection implementations  Note that Java does not provide any direct implementations of Collection.  Rather, concrete implementations are based on other interfaces which extend Collection, such as Set, List, etc.  Still, the most general code will be written using Collection to type variables.

A Peek at generics Old way List myIntList = new LinkedList(); // 1 myIntList.add(new Integer(0)); // 2 Integer x = (Integer) myIntList.iterator().next(); // 3 New way with Generics … List myIntList = new LinkedList (); // 1’ myIntList.add(new Integer(0)); //2’ Integer x = myIntList.iterator().next(); // 3’

Generics vs. Casting  Note that new method is backward compatible with old method –Old code ports –Warnings issues by compiler  What are some advantages of Generics?  What are some disadvantages?  How can we use Generics if we are mixing types?

Another example of Generics Here is a simple example taken from the existing Collections tutorial: // Removes 4-letter words from c. Elements must be strings static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) if (((String) i.next()).length() == 4) i.remove(); } Here is the same example modified to use generics: // Removes the 4-letter words from c static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) if (i.next().length() == 4) i.remove(); } Think “Collection of Strings”

Generics  There are lots of little subtleties introduced by this capability.  Better not to dwell on them this week – will pick up after we study the Collections themselves.

Collection Interface boolean add(Object o); boolean addAll(Collection c); void clear(); boolean contains(Object o); boolean containsAll(Collection c); boolean equals(Object o); int hashCode(); boolean isEmpty(); Iterator iterator(); boolean remove(Object o); boolean removeAll(Collection c); boolean retainAll(Collection c); int size(); Object[] toArray(); Object[] toArray(Object[] a); Optional operation, throw UnsupportedOperationException What does this mean in terms of what we’ve learned about Interfaces and OO architecture?

Comments on Collection methods  Note the iterator() method, which returns an Object which implements the Iterator interface.  Iterator objects are used to traverse elements of the collection in their natural order.  Iterator has the following methods: –boolean hasNext(); // are there any more elements? –Object next(); // return the next element –void remove(); // remove the next element

AbstractCollection Class java.util.AbstractCollection Abstract class which is partial implementation of of Collection interface Implements all methods except iterator() and size() Makes it much less work to implement Collections Interface

List interface  An interface that extends the Collections interface.  An ordered collection (also known as a sequence). –The user of this interface has precise control over where in the list each element is inserted. –The user can access elements by their integer index (position in the list), and search for elements in the list.  Unlike Set, allows duplicate elements.  Provides a special Iterator called ListIterator for looping through elements of the List.

Additional methods in List Interface  List extends Collection with additional methods for performing index-based operations: –void add(int index, Object element) –boolean addAll(int index, Collection collection) –Object get(int index) –int indexOf(Object element) –int lastIndexOf(Object element) –Object remove(int index) –Object set(int index, Object element)

List/ListIterator Interface  The List interface also provides for working with a subset of the collection, as well as iterating through the entire list in a position friendly manner: –ListIterator listIterator() –ListIterator listIterator(int startIndex) –List subList(int fromIndex, int toIndex)  ListIterator extends Iterator and adds methods for bi-directional traversal as well as adding/removing elements from the underlying collection.

Concrete List Implementations  There are two concrete implementations of the List interface –LinkedList –ArrayList  Which is best to use depends on specific needs.  Linked lists tend to be optimal for inserting/removing elements.  ArrayLists are good for traversing elements sequentilly  Note that LinkedList and ArrayList both extend abstract partial implementations of the List interface.

LinkedList Class  The LinkedList class offeres a few additional methods for directly manipulating the ends of the list: –void addFirst(Object) –void addLast(Object); –Object getFirst(); –Object getLast(); –Object removeFirst(); –Object removeLast();  These methods make it natural to implement other simpler data structures, like Stacks and Queues.

LinkedList examples  See heavily commented LinkedList Example in course notes  A few things to be aware of: –it is really bad to use the positional indexing features copiously of LinkedList if you care at all about performance. This is because the LinkedList has no memory and must always traverse the chain from the beginning. –Elements can be changed both with the List and ListIterator objects. That latter is often more convenient. –You can create havoc by creating several iterators that you use to mutate the List. There is some protection built-in, but best is to have only one iterator that will actually mutate the list structure.

ArrayList Class  Also supports the List interface, so top-level code can pretty much invisibly use this class or LinkedList (minus a few additional operations in LinkedList).  However, ArrayList is much better for using positional index access methods.  At the same time, ArrayList is much worse at inserting elements.  This behavior follows from how ArrayLists are structured: they are just like Vectors.

More on ArrayList  Additional methods for managing size of underlying array  size, isEmpty, get, set, iterator, and listIterator methods all run in constant time.  Adding n elements take O[n] time.  Can explicitly grow capacity in anticipation of adding many elements.  Note: legacy Vector class almost identical. Main differences are naming and synchronization.  See short ArrayList example.

Vector class  Like an ArrayList, but synchronized for multithreaded programming.  Mainly for backwards-compatibility with old java.  Used also as base class for Stack implementation.

Stack class  Stack() Creates an empty Stack. Method Stack  boolean empty() Tests if this stack is empty.empty  E peek() Looks at the object at the top of this stack without removing it from the stack. Epeek  E pop() Removes the object at the top of this stack and returns that object as the value of this function. Epop  E push(E item) Pushes an item onto the top of this stack. EpushE  int search(Object o) Returns the 1-based position where an object is on this stack. searchObject

Set Interface  Set also extends Collection, but it prohibits duplicate items (this is what defines a Set).  No new methods are introduced; specifically, none for index-based operations (elements of Sets are not ordered).  Concrete Set implementations contain methods that forbid adding two equal Objects.  More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element  Java has two implementations: HashSet, TreeSet

HashSets and hash tables  Lists allow for ordered elements, but searching them is very slow.  Can speed up search tremendously if you don’t care about ordering.  Hash tables let you do this. Drawback is that you have no control over how elements are ordered.  hashCode() computes integer (quickly) which corresponds to position in hash table.  Independent of other objects in table.

HashSet Class  Hashing can be used to implement several important data structures.  Simplest of these is HashSet –add elements with add(Object) method –contains(Object) is redefined to first look for duplicates. –if duplicate exists, Object is not added  What determines a duplicate? –careful here, must redefine both hashCode() and equals(Object)!

HashSet  Look HashSetExample.java  Play around with some additional methods.  Try creating your own classes and override hashCode method.  Do Some timings.

Tree Sets  Another concrete set implementation in Java is TreeSet.  Similar to HashSet, but one advantage: –While elements are added with no regard for order, they are returned (via iterator) in sorted order. –What is sorted order? this is defined either by having class implement Comparable interface, or passing a Comparator object to the TreeSet Constructor. Latter is more flexible: doesn’t lock in specific sorting rule, for example. Collection could be sorted in one place by name, another by age, etc.

Comparable interface  Many java classes already implement this. Try String, Character, Integer, etc.  Your own classes will have to do this explicitly: –Comparable defines the method public int compareTo(Object other); –Comparator defines the method public int compare(Object a, Object b);  As we discussed before, be aware of the general contracts of these interfaces.  See TreeSetExample.java

Maps  Maps are similar to collections but are actually represented by an entirely different class hierarchy.  Maps store objects by key/value pairs: –map.add(“1234”, “Andrew”); –ie Object Andrew is stored by Object key 1234  Keys may not be duplicated  Each key may map to only one value

Java Map interface  Methods can be broken down into three groups: –querying –altering –obtaining different views  Fairly similar to Collection methods, but Java designers still thought best to make separate hierarchy – no simple answers here.

Map methods  Here is a list of the Map methods: –void clear() –boolean containsKey(Object) –boolean containsValue(Object) –Set entrySet() –boolean get(Object) –boolean isEmpty() –Set keySet() –Object put(Object, Object) –void putall(Map) –Object remove(Object) –int size() –Collection values()

Map Implementations  We won’t go into too much detail on Maps.  Java provides several common class implementations: –HashMap a hashtable implementation of a map good for quick searching where order doesn’t matter must override hashCode and equals –TreeMap A tree implementation of a map Good when natural ordering is required Must be able to define ordering for added elements.

Simplified for loop in 1.5  Old way ArrayList list = new ArrayList (); for (Iterator i = list.iterator(); i.hasNext();) { Integer value=(Integer)i.next(); }  New Way ArrayList list = new ArrayList (); for (Integer i : list) {... }

Autoboxing in jdk1.5  Pre 1.5 – must cast –ArrayList list = new ArrayList (); list.add(0, new Integer(42)); int total = (list.get(0)).intValue();  Post 1.5 – cast done by compiler –ArrayList list = new ArrayList (); list.add(0, 42); int total = list.get(0);

JNI Linking Java and C code

JNI  Stands for “Java Native Interface”  Set of tools/code that allows user to call “native” methods from Java.  Includes “bindings” for C/C++.  Can be used to call C/C++ from Java (typical), or Java from C (invocation API)  Differs from spawning executable – data is passed to/from C/C++ method  Question: why is this difficult?

Reasons for using JNI  Feature not available in java language (rare).  Code already written in another language, don’t want to rewrite (typical).  Java is slow (how slow?)  Other language has no additional features per se, but has much better syntax for handling certain operations (Fortran for math).

Problems with JNI  Only provides C/C++ bindings. Going to Fortran, COBOL, Ada, etc. requires extra step.  Not portable  Mapping is not trivial  Can be unsafe  Cannot run from applet (security issues)

Machinery for using JNI Steps to follow …

Basic steps to calling native code 1. Write java class with at least one method declared with native keyword. Provide no implementation –public native void sayHello(); –Example above is most simple, but method may pass any parameters or have any return type. 2. Add a call to System.loadLibrary(“libname”) in the class that declares the native method: –static{ System.loadLibrary(“hello”);}//static means called only once.

Steps, cont. 3. Compile the class –javac Hello.java 4. Produce the C/C++ header files using the javah utility: –Javah Hello –This produces the header file Hello.h 5. Write your implementation file by first copying the function signature produced in the include file. Also, #include the header file. #include “Hello.h”

Steps, cont. 6. Write the implementation in C/C++. This will require using JNI methods to access the data or possibly casts to convert to basic C/C++ types 7. Best technique: Break into two steps. Think of your C/C++ function as a wrapper which accesses the Java data and maps it to C data using JNI methods, then shoves the converted data into a prewritten standalone C program.

Steps, cont. 8. Compile your native method(s) as a shared object (or DLL on Windows). –WARNING: Be sure to point your linker to the include files in /jdk1.3/include and jdk1.3/include/linux (for example). –WARNING: Mixing languages is much easier using a straight C wrapper rather than C Set the environment variable LD_LIBRARY_PATH to the shared object directory  Run main Java class.

C language bindings What does Java pass to my method?

What does Java pass to my C function?  JNIEnv* : A pointer to the the JNI environment. This pointer is a handle to the current thread in the JVM, and contains mapping functions and other housekeeping information.  jobject : A reference to the object that called the native code. (like “this” pointer).  Any arguments specified by the method.

Pause for some nice pictures

Legacy C calls Java

Java calls legacy

JNI is inter-language “glue”

Simple examples on union  HelloWorld Example: No data passed –Hello.javaHello.java –Hello.ccHello.cc  Max example : Only native dataypes –Utils.javaUtils.java –utils.ccutils.cc  Advanced Max example: Arrays –Utils.javaUtils.java –utils.ccutils.cc  Max Java-C-Fortran: max.fmax.f

General Strategy  Keep interface as simple as

Native datatype mappings Java TypeNative TypeSize in bits booleanjboolean8, unsigned bytejbyte8 charjchar16, unsigned shortjshort16 intjint32 longjlong64 floatjfloat32 doublejdouble64 void N/a

Java object Mappings Object passed by reference All objects have type jobject as:

Object mappings, cont.  For example, if a method getLine exists in a class call Prompt, then: private native String getLine(String Prompt); is mapped into JNIExport jstring JNICALL Java_Prompt_getLine(JNIEnv *, jobject, jstring);  But how to access data/methods from object that is passed in?

JNI Advice  Can seem like a bewildering number of functions.  Do not try to learn it all.  Keep interfaces very simple. –Preferably, only native datatypes, Strings, and arrays.  Be careful about –Copies vs. rerences –Freeing memory  Best not to allocate memory from with native code.

Accessing java strings  Do NOT do the following: JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt){ printf(“%s”, prompt); }  Why is this bad?

Right way to access Strings  Must use special methods in env structure char *str = (*env)->GetStringUTFChars(env,prompt,0); /* this maps into regular C char* */ printf(“%s”, str); /* now it is ok to print */ (*env)->ReleaseStringUTFChars(env, prompt, str); /* must release String to avoid memory leaks */

Returning Strings  Previous technique allows us to use a String passed in from Java.  What if we want to return a String?  Can use NewStringUTF as: char buf[128]; /* allocate memory for local char* in C */ scanf(“%s”, buf); /* read into char* from stdio */ return( (*env)->NewStringUTF(env, buf)); /* construct and return the Java String */

Other JNI String methods  GetStringChars –Takes the Java String and returns a pointer to an array of Unicode characters that comprise it.  ReleaseStringChars –Releases the pointer to the array of Unicode characters  NewString –Constructs a new String object from an array of Unicode Characters  GetStringLength –Returns the length of a string of Unicode characters

Java arrays  Note that you can NOT do the following: JNIExport jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr){ int i, sum = 0; for (i = 0; i<10; i++){ sum += arr[i]; /* NO! – why not? }...  Must use java methods to access array data in C

Array methods  The previous example should be written as: jsize len = (*env)->GetArrayLength(env,arr); jint *body = (*env)->GetIntArrayElements(env,arr,0); for (i=0;i<len;++i){ sum += body[i]; } (*env)->ReleastIntArrayElements(env,arr,body,0); /* very important – copies back to java array if copy had to be made */

Array methods, cont.  Note that there are analagous functions for float, byte, double, etc: –Get ArrayElements –Release ArrayElements  Important: These Get functions may copy the entire array. If this is undesirable, use Get/Set ArrayRegion functions

Function for accessing arrays FunctionArray Type GetBooleanArrayElementsboolean GetByteArrayElementsbyte GetShortArrayElementsshort GetIntArrayElementsint GetLongArrayElementslong GetFloatArrayElementsfloat GetDoubleArrayElementsdouble GetObjectArrayElementsobject

Functions for releasing arrays FunctionArray Type ReleaseBooleanArrayElementsboolean ReleaseByteArrayElementsbyte ReleaseShortArrayElementsshort RelaseIntArrayElementsint ReleaseLongArrayElementslong ReleaseFloatArrayElementsfloat ReleaseDoubleArrayElementsdouble ReleaseObjectArrayElementsobject

Calling java methods  What if you pass a java object to a C routine and wish to “call back” a method on the Java object.  Good to avoid this when you can but sometimes it is very important.  Need to use the jobject reference that is passed in by java.

Steps to follow  Native method calls JNI function GetObjectClass –returns the jclass object that is type of that obj  Native method calls JNI function GetMethodID –returns jmethodID of method in class (0 for no such method)  Finally, native method calls JNI function CallVoidMethod. –invokes an instance of method with void return type. You pass object, methodID, and actual arguments.

A simple alternative – spawning a system executable  Advantages –Infinitely simpler –Portable –Can use any native language  Disadvantages –Can only pass data to and from vi stdout –Must reload executable for each invocation

Legacy Collections  java.util.Vector –Still useable, but typically ArrayList is preffered. –Only major difference is if you are using muliple threads  java.util.HashTable –Still useable, but typically HashMap is preferred. –Again, different if using multiple threads.

JNI JNI (Java Native Interface)

JNI  Stands for “Java Native Interface”  Set of tools/code that allows user to call “native” methods from Java.  Includes “bindings” for C/C++.  Can be used to call C/C++ from Java (typical), or Java from C (invocation API)  Differs from spawning executable – data is passed to/from C/C++ method  Question: why is this difficult?

Reasons for using JNI  Feature not available in java language (rare).  Code already written in another language, don’t want to rewrite (typical).  Java is slow (how slow?)  Other language has no additional features per se, but has much better syntax for handling certain operations (Fortran for math).

Problems with JNI  Only provides C/C++ bindings. Going to Fortran, COBOL, Ada, etc. requires extra step.  Not portable  Mapping is not trivial  Can be unsafe  Cannot run from applet (security issues)

Machinery for using JNI Steps to follow …

Basic steps to calling native code 1. Write java class with at least one method declared with native keyword. Provide no implementation –public native void sayHello(); –Example above is most simple, but method may pass any parameters or have any return type. 2. Add a call to System.loadLibrary(“libname”) in the class that declares the native method: –static{ System.loadLibrary(“hello”);}//static means called only once.

Steps, cont. 3. Compile the class –javac Hello.java 4. Produce the C/C++ header files using the javah utility: –Javah Hello –This produces the header file Hello.h 5. Write your implementation file by first copying the function signature produced in the include file. Also, #include the header file. #include “Hello.h”

Steps, cont. 6. Write the implementation in C/C++. This will require using JNI methods to access the data or possibly casts to convert to basic C/C++ types 7. Best technique: Break into two steps. Think of your C/C++ function as a wrapper which accesses the Java data and maps it to C data using JNI methods, then shoves the converted data into a prewritten standalone C program.

Steps, cont. 8. Compile your native method(s) as a shared object (or DLL on Windows). –WARNING: Be sure to point your linker to the include files in /jdk1.3/include and jdk1.3/include/linux (for example). –WARNING: Mixing languages is much easier using a straight C wrapper rather than C Set the environment variable LD_LIBRARY_PATH to the shared object directory  Run main Java class.

C language bindings What does Java pass to my method?

What does Java pass to my C function?  JNIEnv* : A pointer to the the JNI environment. This pointer is a handle to the current thread in the JVM, and contains mapping functions and other housekeeping information.  jobject : A reference to the object that called the native code. (like “this” pointer).  Any arguments specified by the method.

Pause for some nice pictures

Legacy C calls Java

Java calls legacy

JNI is inter-language “glue”

Simple examples on union  HelloWorld Example: No data passed –Hello.javaHello.java –Hello.ccHello.cc  Max example : Only native dataypes –Utils.javaUtils.java –utils.ccutils.cc  Advanced Max example: Arrays –Utils.javaUtils.java –utils.ccutils.cc  Max Java-C-Fortran: max.fmax.f

General Strategy  Keep interface as simple as

Native datatype mappings Java TypeNative TypeSize in bits booleanjboolean8, unsigned bytejbyte8 charjchar16, unsigned shortjshort16 intjint32 longjlong64 floatjfloat32 doublejdouble64 void N/a

Java object Mappings Object passed by reference All objects have type jobject as:

Object mappings, cont.  For example, if a method getLine exists in a class call Prompt, then: private native String getLine(String Prompt); is mapped into JNIExport jstring JNICALL Java_Prompt_getLine(JNIEnv *, jobject, jstring);  But how to access data/methods from object that is passed in?

JNI Advice  Can seem like a bewildering number of functions.  Do not try to learn it all.  Keep interfaces very simple. –Preferably, only native datatypes, Strings, and arrays.  Be careful about –Copies vs. rerences –Freeing memory  Best not to allocate memory from with native code.

Accessing java strings  Do NOT do the following: JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt){ printf(“%s”, prompt); }  Why is this bad?

Right way to access Strings  Must use special methods in env structure char *str = (*env)->GetStringUTFChars(env,prompt,0); /* this maps into regular C char* */ printf(“%s”, str); /* now it is ok to print */ (*env)->ReleaseStringUTFChars(env, prompt, str); /* must release String to avoid memory leaks */

Returning Strings  Previous technique allows us to use a String passed in from Java.  What if we want to return a String?  Can use NewStringUTF as: char buf[128]; /* allocate memory for local char* in C */ scanf(“%s”, buf); /* read into char* from stdio */ return( (*env)->NewStringUTF(env, buf)); /* construct and return the Java String */

Other JNI String methods  GetStringChars –Takes the Java String and returns a pointer to an array of Unicode characters that comprise it.  ReleaseStringChars –Releases the pointer to the array of Unicode characters  NewString –Constructs a new String object from an array of Unicode Characters  GetStringLength –Returns the length of a string of Unicode characters

Java arrays  Note that you can NOT do the following: JNIExport jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr){ int i, sum = 0; for (i = 0; i<10; i++){ sum += arr[i]; /* NO! – why not? }...  Must use java methods to access array data in C

Array methods  The previous example should be written as: jsize len = (*env)->GetArrayLength(env,arr); jint *body = (*env)->GetIntArrayElements(env,arr,0); for (i=0;i<len;++i){ sum += body[i]; } (*env)->ReleastIntArrayElements(env,arr,body,0); /* very important – copies back to java array if copy had to be made */

Array methods, cont.  Note that there are analagous functions for float, byte, double, etc: –Get ArrayElements –Release ArrayElements  Important: These Get functions may copy the entire array. If this is undesirable, use Get/Set ArrayRegion functions

Function for accessing arrays FunctionArray Type GetBooleanArrayElementsboolean GetByteArrayElementsbyte GetShortArrayElementsshort GetIntArrayElementsint GetLongArrayElementslong GetFloatArrayElementsfloat GetDoubleArrayElementsdouble GetObjectArrayElementsobject

Functions for releasing arrays FunctionArray Type ReleaseBooleanArrayElementsboolean ReleaseByteArrayElementsbyte ReleaseShortArrayElementsshort RelaseIntArrayElementsint ReleaseLongArrayElementslong ReleaseFloatArrayElementsfloat ReleaseDoubleArrayElementsdouble ReleaseObjectArrayElementsobject

Calling java methods  What if you pass a java object to a C routine and wish to “call back” a method on the Java object.  Good to avoid this when you can but sometimes it is very important.  Need to use the jobject reference that is passed in by java.

Steps to follow  Native method calls JNI function GetObjectClass –returns the jclass object that is type of that obj  Native method calls JNI function GetMethodID –returns jmethodID of method in class (0 for no such method)  Finally, native method calls JNI function CallVoidMethod. –invokes an instance of method with void return type. You pass object, methodID, and actual arguments.

A simple alternative – spawning a system executable  Advantages –Infinitely simpler –Portable –Can use any native language  Disadvantages –Can only pass data to and from vi stdout –Must reload executable for each invocation

Spawning Executable -- technique  Process p = Runtime.exec(“some_exec”);  Use p to manage process: –p.getInputStream(); –p.getOutputStream(); –p.kill(); –p.halt();