page.title=JNI Tips
@jd:body

<div id="qv-wrapper">
<div id="qv">

<h2>In this document</h2>
<ol>
  <li><a href="#JavaVM_and_JNIEnv">JavaVM and JNIEnv</a></li>
  <li><a href="#threads">Threads</a></li>
  <li><a href="#jclass_jmethodID_and_jfieldID">jclass, jmethodID, and jfieldID</a></li>
  <li><a href="#local_and_global_references">Local and Global References</a></li>
  <li><a href="#UTF_8_and_UTF_16_strings">UTF-8 and UTF-16 Strings</a></li>
  <li><a href="#arrays">Primitive Arrays</a></li>
  <li><a href="#region_calls">Region Calls</a></li>
  <li><a href="#exceptions">Exceptions</a></li>
  <li><a href="#extended_checking">Extended Checking</a> </li>
  <li><a href="#native_libraries">Native Libraries</a></li>
  <li><a href="#64_bit">64-bit Considerations</a></li>
  <li><a href="#unsupported">Unsupported Features/Backwards Compatibility</a></li>
  <li><a href="#faq_ULE">FAQ: Why do I get <code>UnsatisfiedLinkError</code></a></li>
  <li><a href="#faq_FindClass">FAQ: Why didn't <code>FindClass</code> find my class?</a></li>
  <li><a href="#faq_sharing">FAQ: How do I share raw data with native code?</a></li>
</ol>

</div>
</div>

<p>JNI is the Java Native Interface.  It defines a way for managed code
(written in the Java programming language) to interact with native
code (written in C/C++).  It's vendor-neutral, has support for loading code from
dynamic shared libraries, and while cumbersome at times is reasonably efficient.</p>

<p>You really should read through the
<a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html">JNI spec for J2SE 6</a>
to get a sense for how JNI works and what features are available.  Some
aspects of the interface aren't immediately obvious on
first reading, so you may find the next few sections handy.
There's a more detailed <a href="http://java.sun.com/docs/books/jni/html/jniTOC.html">JNI Programmer's Guide and Specification</a>.</p>


<a name="JavaVM_and_JNIEnv" id="JavaVM_and_JNIEnv"></a>
<h2>JavaVM and JNIEnv</h2>

<p>JNI defines two key data structures, "JavaVM" and "JNIEnv".  Both of these are essentially
pointers to pointers to function tables.  (In the C++ version, they're classes with a
pointer to a function table and a member function for each JNI function that indirects through
the table.)  The JavaVM provides the "invocation interface" functions,
which allow you to create and destroy a JavaVM.  In theory you can have multiple JavaVMs per process,
but Android only allows one.</p>

<p>The JNIEnv provides most of the JNI functions.  Your native functions all receive a JNIEnv as
the first argument.</p>

<p>The JNIEnv is used for thread-local storage.  For this reason, <strong>you cannot share a JNIEnv between threads</strong>.
If a piece of code has no other way to get its JNIEnv, you should share
the JavaVM, and use <code>GetEnv</code> to discover the thread's JNIEnv. (Assuming it has one; see <code>AttachCurrentThread</code> below.)</p>

<p>The C declarations of JNIEnv and JavaVM are different from the C++
declarations.  The <code>"jni.h"</code> include file provides different typedefs
depending on whether it's included into C or C++.  For this reason it's a bad idea to
include JNIEnv arguments in header files included by both languages.  (Put another way: if your
header file requires <code>#ifdef __cplusplus</code>, you may have to do some extra work if anything in
that header refers to JNIEnv.)</p>

<a name="threads" id="threads"></a>
<h2>Threads</h2>

<p>All threads are Linux threads, scheduled by the kernel.  They're usually
started from managed code (using <code>Thread.start</code>),
but they can also be created elsewhere and then attached to the JavaVM.  For
example, a thread started with <code>pthread_create</code> can be attached
with the JNI <code>AttachCurrentThread</code> or
<code>AttachCurrentThreadAsDaemon</code> functions.  Until a thread is
attached, it has no JNIEnv, and <strong>cannot make JNI calls</strong>.</p>

<p>Attaching a natively-created thread causes a <code>java.lang.Thread</code>
object to be constructed and added to the "main" <code>ThreadGroup</code>,
making it visible to the debugger.  Calling <code>AttachCurrentThread</code>
on an already-attached thread is a no-op.</p>

<p>Android does not suspend threads executing native code.  If
garbage collection is in progress, or the debugger has issued a suspend
request, Android will pause the thread the next time it makes a JNI call.</p>

<p>Threads attached through JNI <strong>must call
<code>DetachCurrentThread</code> before they exit</strong>.
If coding this directly is awkward, in Android 2.0 (Eclair) and higher you
can use <code>pthread_key_create</code> to define a destructor
function that will be called before the thread exits, and
call <code>DetachCurrentThread</code> from there.  (Use that
key with <code>pthread_setspecific</code> to store the JNIEnv in
thread-local-storage; that way it'll be passed into your destructor as
the argument.)</p>


<a name="jclass_jmethodID_and_jfieldID" id="jclass_jmethodID_and_jfieldID"></a>
<h2>jclass, jmethodID, and jfieldID</h2>

<p>If you want to access an object's field from native code, you would do the following:</p>

<ul>
<li> Get the class object reference for the class with <code>FindClass</code></li>
<li> Get the field ID for the field with <code>GetFieldID</code></li>
<li> Get the contents of the field with something appropriate, such as
<code>GetIntField</code></li>
</ul>

<p>Similarly, to call a method, you'd first get a class object reference and then a method ID.  The IDs are often just
pointers to internal runtime data structures.  Looking them up may require several string
comparisons, but once you have them the actual call to get the field or invoke the method
is very quick.</p>

<p>If performance is important, it's useful to look the values up once and cache the results
in your native code.  Because there is a limit of one JavaVM per process, it's reasonable
to store this data in a static local structure.</p>

<p>The class references, field IDs, and method IDs are guaranteed valid until the class is unloaded.  Classes
are only unloaded if all classes associated with a ClassLoader can be garbage collected,
which is rare but will not be impossible in Android.  Note however that
the <code>jclass</code>
is a class reference and <strong>must be protected</strong> with a call
to <code>NewGlobalRef</code> (see the next section).</p>

<p>If you would like to cache the IDs when a class is loaded, and automatically re-cache them
if the class is ever unloaded and reloaded, the correct way to initialize
the IDs is to add a piece of code that looks like this to the appropriate class:</p>

<pre>    /*
     * We use a class initializer to allow the native code to cache some
     * field offsets. This native function looks up and caches interesting
     * class/field/method IDs. Throws on failure.
     */
    private static native void nativeInit();

    static {
        nativeInit();
    }</pre>

<p>Create a <code>nativeClassInit</code> method in your C/C++ code that performs the ID lookups.  The code
will be executed once, when the class is initialized.  If the class is ever unloaded and
then reloaded, it will be executed again.</p>

<a name="local_and_global_references" id="local_and_global_references"></a>
<h2>Local and Global References</h2>

<p>Every argument passed to a native method, and almost every object returned
by a JNI function is a "local reference".  This means that it's valid for the
duration of the current native method in the current thread.
<strong>Even if the object itself continues to live on after the native method
returns, the reference is not valid.</strong>
<p>This applies to all sub-classes of <code>jobject</code>, including
<code>jclass</code>, <code>jstring</code>, and <code>jarray</code>.
(The runtime will warn you about most reference mis-uses when extended JNI
checks are enabled.)</p>
<p>The only way to get non-local references is via the functions
<code>NewGlobalRef</code> and <code>NewWeakGlobalRef</code>.

<p>If you want to hold on to a reference for a longer period, you must use
a "global" reference.  The <code>NewGlobalRef</code> function takes the
local reference as an argument and returns a global one.
The global reference is guaranteed to be valid until you call
<code>DeleteGlobalRef</code>.</p>

<p>This pattern is commonly used when caching a jclass returned
from <code>FindClass</code>, e.g.:</p>
<pre>jclass localClass = env-&gt;FindClass("MyClass");
jclass globalClass = reinterpret_cast&lt;jclass&gt;(env-&gt;NewGlobalRef(localClass));</pre>

<p>All JNI methods accept both local and global references as arguments.
It's possible for references to the same object to have different values.
For example, the return values from consecutive calls to
<code>NewGlobalRef</code> on the same object may be different.
<strong>To see if two references refer to the same object,
you must use the <code>IsSameObject</code> function.</strong>  Never compare
references with <code>==</code> in native code.</p>

<p>One consequence of this is that you
<strong>must not assume object references are constant or unique</strong>
in native code.  The 32-bit value representing an object may be different
from one invocation of a method to the next, and it's possible that two
different objects could have the same 32-bit value on consecutive calls.  Do
not use <code>jobject</code> values as keys.</p>

<p>Programmers are required to "not excessively allocate" local references.  In practical terms this means
that if you're creating large numbers of local references, perhaps while running through an array of
objects, you should free them manually with
<code>DeleteLocalRef</code> instead of letting JNI do it for you.  The
implementation is only required to reserve slots for
16 local references, so if you need more than that you should either delete as you go or use
<code>EnsureLocalCapacity</code>/<code>PushLocalFrame</code> to reserve more.</p>

<p>Note that <code>jfieldID</code>s and <code>jmethodID</code>s are opaque
types, not object references, and should not be passed to
<code>NewGlobalRef</code>.  The raw data
pointers returned by functions like <code>GetStringUTFChars</code>
and <code>GetByteArrayElements</code> are also not objects. (They may be passed
between threads, and are valid until the matching Release call.)</p>

<p>One unusual case deserves separate mention.  If you attach a native
thread with <code>AttachCurrentThread</code>, the code you are running will
never automatically free local references until the thread detaches.  Any local
references you create will have to be deleted manually. In general, any native
code that creates local references in a loop probably needs to do some manual
deletion.</p>

<a name="UTF_8_and_UTF_16_strings" id="UTF_8_and_UTF_16_strings"></a>
<h2>UTF-8 and UTF-16 Strings</h2>

<p>The Java programming language uses UTF-16.  For convenience, JNI provides methods that work with <a href="http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8">Modified UTF-8</a> as well.  The
modified encoding is useful for C code because it encodes \u0000 as 0xc0 0x80 instead of 0x00.
The nice thing about this is that you can count on having C-style zero-terminated strings,
suitable for use with standard libc string functions.  The down side is that you cannot pass
arbitrary UTF-8 data to JNI and expect it to work correctly.</p>

<p>If possible, it's usually faster to operate with UTF-16 strings. Android
currently does not require a copy in <code>GetStringChars</code>, whereas
<code>GetStringUTFChars</code> requires an allocation and a conversion to
UTF-8.  Note that
<strong>UTF-16 strings are not zero-terminated</strong>, and \u0000 is allowed,
so you need to hang on to the string length as well as
the jchar pointer.</p>

<p><strong>Don't forget to <code>Release</code> the strings you <code>Get</code></strong>.  The
string functions return <code>jchar*</code> or <code>jbyte*</code>, which
are C-style pointers to primitive data rather than local references.  They
are guaranteed valid until <code>Release</code> is called, which means they are not
released when the native method returns.</p>

<p><strong>Data passed to NewStringUTF must be in Modified UTF-8 format</strong>.  A
common mistake is reading character data from a file or network stream
and handing it to <code>NewStringUTF</code> without filtering it.
Unless you know the data is 7-bit ASCII, you need to strip out high-ASCII
characters or convert them to proper Modified UTF-8 form.  If you don't,
the UTF-16 conversion will likely not be what you expect.  The extended
JNI checks will scan strings and warn you about invalid data, but they
won't catch everything.</p>

<a name="arrays" id="arrays"></a>
<h2>Primitive Arrays</h2>

<p>JNI provides functions for accessing the contents of array objects.
While arrays of objects must be accessed one entry at a time, arrays of
primitives can be read and written directly as if they were declared in C.</p>

<p>To make the interface as efficient as possible without constraining
the VM implementation, the <code>Get&lt;PrimitiveType&gt;ArrayElements</code>
family of calls allows the runtime to either return a pointer to the actual elements, or
allocate some memory and make a copy.  Either way, the raw pointer returned
is guaranteed to be valid until the corresponding <code>Release</code> call
is issued (which implies that, if the data wasn't copied, the array object
will be pinned down and can't be relocated as part of compacting the heap).
<strong>You must <code>Release</code> every array you <code>Get</code>.</strong>  Also, if the <code>Get</code>
call fails, you must ensure that your code doesn't try to <code>Release</code> a NULL
pointer later.</p>

<p>You can determine whether or not the data was copied by passing in a
non-NULL pointer for the <code>isCopy</code> argument.  This is rarely
useful.</p>

<p>The <code>Release</code> call takes a <code>mode</code> argument that can
have one of three values.  The actions performed by the runtime depend upon
whether it returned a pointer to the actual data or a copy of it:</p>

<ul>
    <li><code>0</code>
    <ul>
        <li>Actual: the array object is un-pinned.
        <li>Copy: data is copied back.  The buffer with the copy is freed.
    </ul>
    <li><code>JNI_COMMIT</code>
    <ul>
        <li>Actual: does nothing.
        <li>Copy: data is copied back.  The buffer with the copy
        <strong>is not freed</strong>.
    </ul>
    <li><code>JNI_ABORT</code>
    <ul>
        <li>Actual: the array object is un-pinned.  Earlier
        writes are <strong>not</strong> aborted.
        <li>Copy: the buffer with the copy is freed; any changes to it are lost.
    </ul>
</ul>

<p>One reason for checking the <code>isCopy</code> flag is to know if
you need to call <code>Release</code> with <code>JNI_COMMIT</code>
after making changes to an array &mdash; if you're alternating between making
changes and executing code that uses the contents of the array, you may be
able to
skip the no-op commit.  Another possible reason for checking the flag is for
efficient handling of <code>JNI_ABORT</code>.  For example, you might want
to get an array, modify it in place, pass pieces to other functions, and
then discard the changes.  If you know that JNI is making a new copy for
you, there's no need to create another "editable" copy.  If JNI is passing
you the original, then you do need to make your own copy.</p>

<p>It is a common mistake (repeated in example code) to assume that you can skip the <code>Release</code> call if
<code>*isCopy</code> is false.  This is not the case.  If no copy buffer was
allocated, then the original memory must be pinned down and can't be moved by
the garbage collector.</p>

<p>Also note that the <code>JNI_COMMIT</code> flag does <strong>not</strong> release the array,
and you will need to call <code>Release</code> again with a different flag
eventually.</p>


<a name="region_calls" id="region_calls"></a>
<h2>Region Calls</h2>

<p>There is an alternative to calls like <code>Get&lt;Type&gt;ArrayElements</code>
and <code>GetStringChars</code> that may be very helpful when all you want
to do is copy data in or out.  Consider the following:</p>

<pre>    jbyte* data = env-&gt;GetByteArrayElements(array, NULL);
    if (data != NULL) {
        memcpy(buffer, data, len);
        env-&gt;ReleaseByteArrayElements(array, data, JNI_ABORT);
    }</pre>

<p>This grabs the array, copies the first <code>len</code> byte
elements out of it, and then releases the array.  Depending upon the
implementation, the <code>Get</code> call will either pin or copy the array
contents.
The code copies the data (for perhaps a second time), then calls <code>Release</code>; in this case
<code>JNI_ABORT</code> ensures there's no chance of a third copy.</p>

<p>One can accomplish the same thing more simply:</p>
<pre>    env-&gt;GetByteArrayRegion(array, 0, len, buffer);</pre>

<p>This has several advantages:</p>
<ul>
    <li>Requires one JNI call instead of 2, reducing overhead.
    <li>Doesn't require pinning or extra data copies.
    <li>Reduces the risk of programmer error &mdash; no risk of forgetting
    to call <code>Release</code> after something fails.
</ul>

<p>Similarly, you can use the <code>Set&lt;Type&gt;ArrayRegion</code> call
to copy data into an array, and <code>GetStringRegion</code> or
<code>GetStringUTFRegion</code> to copy characters out of a
<code>String</code>.


<a name="exceptions" id="exceptions"></a>
<h2>Exceptions</h2>

<p><strong>You must not call most JNI functions while an exception is pending.</strong>
Your code is expected to notice the exception (via the function's return value,
<code>ExceptionCheck</code>, or <code>ExceptionOccurred</code>) and return,
or clear the exception and handle it.</p>

<p>The only JNI functions that you are allowed to call while an exception is
pending are:</p>
<ul>
    <li><code>DeleteGlobalRef</code>
    <li><code>DeleteLocalRef</code>
    <li><code>DeleteWeakGlobalRef</code>
    <li><code>ExceptionCheck</code>
    <li><code>ExceptionClear</code>
    <li><code>ExceptionDescribe</code>
    <li><code>ExceptionOccurred</code>
    <li><code>MonitorExit</code>
    <li><code>PopLocalFrame</code>
    <li><code>PushLocalFrame</code>
    <li><code>Release&lt;PrimitiveType&gt;ArrayElements</code>
    <li><code>ReleasePrimitiveArrayCritical</code>
    <li><code>ReleaseStringChars</code>
    <li><code>ReleaseStringCritical</code>
    <li><code>ReleaseStringUTFChars</code>
</ul>

<p>Many JNI calls can throw an exception, but often provide a simpler way
of checking for failure.  For example, if <code>NewString</code> returns
a non-NULL value, you don't need to check for an exception.  However, if
you call a method (using a function like <code>CallObjectMethod</code>),
you must always check for an exception, because the return value is not
going to be valid if an exception was thrown.</p>

<p>Note that exceptions thrown by interpreted code do not unwind native stack
frames, and Android does not yet support C++ exceptions.
The JNI <code>Throw</code> and <code>ThrowNew</code> instructions just
set an exception pointer in the current thread.  Upon returning to managed
from native code, the exception will be noted and handled appropriately.</p>

<p>Native code can "catch" an exception by calling <code>ExceptionCheck</code> or
<code>ExceptionOccurred</code>, and clear it with
<code>ExceptionClear</code>.  As usual,
discarding exceptions without handling them can lead to problems.</p>

<p>There are no built-in functions for manipulating the <code>Throwable</code> object
itself, so if you want to (say) get the exception string you will need to
find the <code>Throwable</code> class, look up the method ID for
<code>getMessage "()Ljava/lang/String;"</code>, invoke it, and if the result
is non-NULL use <code>GetStringUTFChars</code> to get something you can
hand to <code>printf(3)</code> or equivalent.</p>


<a name="extended_checking" id="extended_checking"></a>
<h2>Extended Checking</h2>

<p>JNI does very little error checking. Errors usually result in a crash. Android also offers a mode called CheckJNI, where the JavaVM and JNIEnv function table pointers are switched to tables of functions that perform an extended series of checks before calling the standard implementation.</p>

<p>The additional checks include:</p>

<ul>
<li>Arrays: attempting to allocate a negative-sized array.</li>
<li>Bad pointers: passing a bad jarray/jclass/jobject/jstring to a JNI call, or passing a NULL pointer to a JNI call with a non-nullable argument.</li>
<li>Class names: passing anything but the “java/lang/String” style of class name to a JNI call.</li>
<li>Critical calls: making a JNI call between a “critical” get and its corresponding release.</li>
<li>Direct ByteBuffers: passing bad arguments to <code>NewDirectByteBuffer</code>.</li>
<li>Exceptions: making a JNI call while there’s an exception pending.</li>
<li>JNIEnv*s: using a JNIEnv* from the wrong thread.</li>
<li>jfieldIDs: using a NULL jfieldID, or using a jfieldID to set a field to a value of the wrong type (trying to assign a StringBuilder to a String field, say), or using a jfieldID for a static field to set an instance field or vice versa, or using a jfieldID from one class with instances of another class.</li>
<li>jmethodIDs: using the wrong kind of jmethodID when making a <code>Call*Method</code> JNI call: incorrect return type, static/non-static mismatch, wrong type for ‘this’ (for non-static calls) or wrong class (for static calls).</li>
<li>References: using <code>DeleteGlobalRef</code>/<code>DeleteLocalRef</code> on the wrong kind of reference.</li>
<li>Release modes: passing a bad release mode to a release call (something other than <code>0</code>, <code>JNI_ABORT</code>, or <code>JNI_COMMIT</code>).</li>
<li>Type safety: returning an incompatible type from your native method (returning a StringBuilder from a method declared to return a String, say).</li>
<li>UTF-8: passing an invalid <a href="http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8">Modified UTF-8</a> byte sequence to a JNI call.</li>
</ul>

<p>(Accessibility of methods and fields is still not checked: access restrictions don't apply to native code.)</p>

<p>There are several ways to enable CheckJNI.</p>

<p>If you’re using the emulator, CheckJNI is on by default.</p>

<p>If you have a rooted device, you can use the following sequence of commands to restart the runtime with CheckJNI enabled:</p>

<pre>adb shell stop
adb shell setprop dalvik.vm.checkjni true
adb shell start</pre>

<p>In either of these cases, you’ll see something like this in your logcat output when the runtime starts:</p>

<pre>D AndroidRuntime: CheckJNI is ON</pre>

<p>If you have a regular device, you can use the following command:</p>

<pre>adb shell setprop debug.checkjni 1</pre>

<p>This won’t affect already-running apps, but any app launched from that point on will have CheckJNI enabled. (Change the property to any other value or simply rebooting will disable CheckJNI again.) In this case, you’ll see something like this in your logcat output the next time an app starts:</p>

<pre>D Late-enabling CheckJNI</pre>




<a name="native_libraries" id="native_libraries"></a>
<h2>Native Libraries</h2>

<p>You can load native code from shared libraries with the standard
<code>System.loadLibrary</code> call.  The
preferred way to get at your native code is:</p>

<ul>
<li> Call <code>System.loadLibrary</code> from a static class
initializer.  (See the earlier example, where one is used to call
<code>nativeClassInit</code>.)  The argument is the "undecorated"
library name, so to load "libfubar.so" you would pass in "fubar".</li>
<li> Provide a native function: <code><strong>jint JNI_OnLoad(JavaVM* vm, void* reserved)</strong></code></li>
<li>In <code>JNI_OnLoad</code>, register all of your native methods.  You
should declare
the methods "static" so the names don't take up space in the symbol table
on the device.</li>
</ul>

<p>The <code>JNI_OnLoad</code> function should look something like this if
written in C++:</p>
<pre>jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env;
    if (vm-&gt;GetEnv(reinterpret_cast&lt;void**&gt;(&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    // Get jclass with env-&gt;FindClass.
    // Register methods with env-&gt;RegisterNatives.

    return JNI_VERSION_1_6;
}</pre>

<p>You can also call <code>System.load</code> with the full path name of the
shared library.  For Android apps, you may find it useful to get the full
path to the application's private data storage area from the context object.</p>

<p>This is the recommended approach, but not the only approach.  Explicit
registration is not required, nor is it necessary that you provide a
<code>JNI_OnLoad</code> function.
You can instead use "discovery" of native methods that are named in a
specific way (see <a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615">the JNI spec</a> for details), though this is less desirable because if a method signature is wrong you won't know
about it until the first time the method is actually used.</p>

<p>One other note about <code>JNI_OnLoad</code>: any <code>FindClass</code>
calls you make from there will happen in the context of the class loader
that was used to load the shared library.  Normally <code>FindClass</code>
uses the loader associated with the method at the top of the interpreted
stack, or if there isn't one (because the thread was just attached) it uses
the "system" class loader.  This makes
<code>JNI_OnLoad</code> a convenient place to look up and cache class
object references.</p>


<a name="64_bit" id="64_bit"></a>
<h2>64-bit Considerations</h2>

<p>Android is currently expected to run on 32-bit platforms.  In theory it
could be built for a 64-bit system, but that is not a goal at this time.
For the most part this isn't something that you will need to worry about
when interacting with native code,
but it becomes significant if you plan to store pointers to native
structures in integer fields in an object.  To support architectures
that use 64-bit pointers, <strong>you need to stash your native pointers in a
<code>long</code> field rather than an <code>int</code></strong>.


<a name="unsupported" id="unsupported"></a>
<h2>Unsupported Features/Backwards Compatibility</h2>

<p>All JNI 1.6 features are supported, with the following exception:</p>
<ul>
    <li><code>DefineClass</code> is not implemented.  Android does not use
    Java bytecodes or class files, so passing in binary class data
    doesn't work.</li>
</ul>

<p>For backward compatibility with older Android releases, you may need to
be aware of:</p>
<ul>
    <li><b>Dynamic lookup of native functions</b>
    <p>Until Android 2.0 (Eclair), the '$' character was not properly
    converted to "_00024" during searches for method names.  Working
    around this requires using explicit registration or moving the
    native methods out of inner classes.
    <li><b>Detaching threads</b>
    <p>Until Android 2.0 (Eclair), it was not possible to use a <code>pthread_key_create</code>
    destructor function to avoid the "thread must be detached before
    exit" check.  (The runtime also uses a pthread key destructor function,
    so it'd be a race to see which gets called first.)
    <li><b>Weak global references</b>
    <p>Until Android 2.2 (Froyo), weak global references were not implemented.
    Older versions will vigorously reject attempts to use them.  You can use
    the Android platform version constants to test for support.
    <p>Until Android 4.0 (Ice Cream Sandwich), weak global references could only
    be passed to <code>NewLocalRef</code>, <code>NewGlobalRef</code>, and
    <code>DeleteWeakGlobalRef</code>. (The spec strongly encourages
    programmers to create hard references to weak globals before doing
    anything with them, so this should not be at all limiting.)
    <p>From Android 4.0 (Ice Cream Sandwich) on, weak global references can be
    used like any other JNI references.</li>
    <li><b>Local references</b>
    <p>Until Android 4.0 (Ice Cream Sandwich), local references were
    actually direct pointers. Ice Cream Sandwich added the indirection
    necessary to support better garbage collectors, but this means that lots
    of JNI bugs are undetectable on older releases. See
    <a href="http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html">JNI Local Reference Changes in ICS</a> for more details.
    <li><b>Determining reference type with <code>GetObjectRefType</code></b>
    <p>Until Android 4.0 (Ice Cream Sandwich), as a consequence of the use of
    direct pointers (see above), it was impossible to implement
    <code>GetObjectRefType</code> correctly. Instead we used a heuristic
    that looked through the weak globals table, the arguments, the locals
    table, and the globals table in that order. The first time it found your
    direct pointer, it would report that your reference was of the type it
    happened to be examining. This meant, for example, that if 
    you called <code>GetObjectRefType</code> on a global jclass that happened
    to be the same as the jclass passed as an implicit argument to your static 
    native method, you'd get <code>JNILocalRefType</code> rather than
    <code>JNIGlobalRefType</code>.
</ul>


<a name="faq_ULE" id="faq_ULE"></a>
<h2>FAQ: Why do I get <code>UnsatisfiedLinkError</code>?</h2>

<p>When working on native code it's not uncommon to see a failure like this:</p>
<pre>java.lang.UnsatisfiedLinkError: Library foo not found</pre>

<p>In some cases it means what it says &mdash; the library wasn't found.  In
other cases the library exists but couldn't be opened by <code>dlopen(3)</code>, and
the details of the failure can be found in the exception's detail message.</p>

<p>Common reasons why you might encounter "library not found" exceptions:</p>
<ul>
    <li>The library doesn't exist or isn't accessible to the app.  Use
    <code>adb shell ls -l &lt;path&gt;</code> to check its presence
    and permissions.
    <li>The library wasn't built with the NDK.  This can result in
    dependencies on functions or libraries that don't exist on the device.
</ul>

<p>Another class of <code>UnsatisfiedLinkError</code> failures looks like:</p>
<pre>java.lang.UnsatisfiedLinkError: myfunc
        at Foo.myfunc(Native Method)
        at Foo.main(Foo.java:10)</pre>

<p>In logcat, you'll see:</p>
<pre>W/dalvikvm(  880): No implementation found for native LFoo;.myfunc ()V</pre>

<p>This means that the runtime tried to find a matching method but was
unsuccessful.  Some common reasons for this are:</p>
<ul>
    <li>The library isn't getting loaded.  Check the logcat output for
    messages about library loading.
    <li>The method isn't being found due to a name or signature mismatch.  This
    is commonly caused by:
    <ul>
        <li>For lazy method lookup, failing to declare C++ functions
        with <code>extern "C"</code> and appropriate
        visibility (<code>JNIEXPORT</code>). Note that prior to Ice Cream
        Sandwich, the JNIEXPORT macro was incorrect, so using a new GCC with
        an old <code>jni.h</code> won't work.
        You can use <code>arm-eabi-nm</code>
        to see the symbols as they appear in the library; if they look
        mangled (something like <code>_Z15Java_Foo_myfuncP7_JNIEnvP7_jclass</code>
        rather than <code>Java_Foo_myfunc</code>), or if the symbol type is
        a lowercase 't' rather than an uppercase 'T', then you need to
        adjust the declaration.
        <li>For explicit registration, minor errors when entering the
        method signature.  Make sure that what you're passing to the
        registration call matches the signature in the log file.
        Remember that 'B' is <code>byte</code> and 'Z' is <code>boolean</code>.
        Class name components in signatures start with 'L', end with ';',
        use '/' to separate package/class names, and use '$' to separate
        inner-class names (<code>Ljava/util/Map$Entry;</code>, say).
    </ul>
</ul>

<p>Using <code>javah</code> to automatically generate JNI headers may help
avoid some problems.


<a name="faq_FindClass" id="faq_FindClass"></a>
<h2>FAQ: Why didn't <code>FindClass</code> find my class?</h2>

<p>Make sure that the class name string has the correct format.  JNI class
names start with the package name and are separated with slashes,
such as <code>java/lang/String</code>.  If you're looking up an array class,
you need to start with the appropriate number of square brackets and
must also wrap the class with 'L' and ';', so a one-dimensional array of
<code>String</code> would be <code>[Ljava/lang/String;</code>.</p>

<p>If the class name looks right, you could be running into a class loader
issue.  <code>FindClass</code> wants to start the class search in the
class loader associated with your code.  It examines the call stack,
which will look something like:
<pre>    Foo.myfunc(Native Method)
    Foo.main(Foo.java:10)
    dalvik.system.NativeStart.main(Native Method)</pre>

<p>The topmost method is <code>Foo.myfunc</code>.  <code>FindClass</code>
finds the <code>ClassLoader</code> object associated with the <code>Foo</code>
class and uses that.</p>

<p>This usually does what you want.  You can get into trouble if you
create a thread yourself (perhaps by calling <code>pthread_create</code>
and then attaching it with <code>AttachCurrentThread</code>).
Now the stack trace looks like this:</p>
<pre>    dalvik.system.NativeStart.run(Native Method)</pre>

<p>The topmost method is <code>NativeStart.run</code>, which isn't part of
your application.  If you call <code>FindClass</code> from this thread, the
JavaVM will start in the "system" class loader instead of the one associated
with your application, so attempts to find app-specific classes will fail.</p>

<p>There are a few ways to work around this:</p>
<ul>
    <li>Do your <code>FindClass</code> lookups once, in
    <code>JNI_OnLoad</code>, and cache the class references for later
    use.  Any <code>FindClass</code> calls made as part of executing
    <code>JNI_OnLoad</code> will use the class loader associated with
    the function that called <code>System.loadLibrary</code> (this is a
    special rule, provided to make library initialization more convenient).
    If your app code is loading the library, <code>FindClass</code>
    will use the correct class loader.
    <li>Pass an instance of the class into the functions that need
    it, by declaring your native method to take a Class argument and
    then passing <code>Foo.class</code> in.
    <li>Cache a reference to the <code>ClassLoader</code> object somewhere
    handy, and issue <code>loadClass</code> calls directly.  This requires
    some effort.
</ul>


<a name="faq_sharing" id="faq_sharing"></a>
<h2>FAQ: How do I share raw data with native code?</h2>

<p>You may find yourself in a situation where you need to access a large
buffer of raw data from both managed and native code.  Common examples
include manipulation of bitmaps or sound samples.  There are two
basic approaches.</p>

<p>You can store the data in a <code>byte[]</code>.  This allows very fast
access from managed code.  On the native side, however, you're
not guaranteed to be able to access the data without having to copy it.  In
some implementations, <code>GetByteArrayElements</code> and
<code>GetPrimitiveArrayCritical</code> will return actual pointers to the
raw data in the managed heap, but in others it will allocate a buffer
on the native heap and copy the data over.</p>

<p>The alternative is to store the data in a direct byte buffer.  These
can be created with <code>java.nio.ByteBuffer.allocateDirect</code>, or
the JNI <code>NewDirectByteBuffer</code> function.  Unlike regular
byte buffers, the storage is not allocated on the managed heap, and can
always be accessed directly from native code (get the address
with <code>GetDirectBufferAddress</code>).  Depending on how direct
byte buffer access is implemented, accessing the data from managed code
can be very slow.</p>

<p>The choice of which to use depends on two factors:</p>
<ol>
    <li>Will most of the data accesses happen from code written in Java
    or in C/C++?
    <li>If the data is eventually being passed to a system API, what form
    must it be in?  (For example, if the data is eventually passed to a
    function that takes a byte[], doing processing in a direct
    <code>ByteBuffer</code> might be unwise.)
</ol>

<p>If there's no clear winner, use a direct byte buffer.  Support for them
is built directly into JNI, and performance should improve in future releases.</p>
